ホームページ > バックエンド開発 > PHPチュートリアル > CodeIgniter が Nginx に遭遇したときの 404 エラーを解決する方法

CodeIgniter が Nginx に遭遇したときの 404 エラーを解決する方法

PHP中文网
リリース: 2016-07-29 09:12:19
オリジナル
1108 人が閲覧しました

CodeIgniter はもともと Apache 用に設計されており、Apache は pathinfo のサポートが優れているため、すべてが非常に優れています。しかし、自分が書いたコードを nginx に置いたとき、おそらく CodeIgniter のウェルカム以外はすべて 404 エラーだったと思うでしょう。そして、CodeIgniter の公式ドキュメントには Nginx の設定について何も記載されていないことに驚きました。そしてあなたは百度」CodeIgniter Nginx 404" を開くと、山積みの記事を検索できます。奇妙なことに、ほとんどすべてのドキュメントの設定方法が異なるようです。うまく設定できた場合は、おそらく数晩かけて設定することはできないでしょう。私も同様です。 (この記事のサーバー環境: CentOS、nginx-1.4.7、PHP-5.4.24、CodeIgniter3.0.2 - 最新バージョン)

404エラーの理由

その理由は、Nginxがpathinfoをサポートしていないためです。デフォルトでは、ブラウザに http:xxx.xxx.comindex.phppageshome と入力すると、Nginx は、index.php ディレクトリの下にあるページ フォルダのホームにアクセスするとみなして、404 を報告します。 見つからないエラー。

解決策

解決策は間違いなく、サーバーのリダイレクト ルールを変更することです。おそらく 2 つの方法があります。1 つは、nginx インストール ディレクトリの nginx.conf ファイルを変更することです。仮想ホストを使用している場合は、nginx に移動します。インストール ディレクトリを vhosts で対応する *.conf を見つけて変更するだけです。もう 1 つのアイデアは、CI ディレクトリ内の .htaccess ファイルを変更することです。http://blog.csdn.net/freshlover/article/details/8977111 を参照してください。
この記事は最初のアイデアです。変更する前に、元の conf ファイルを見てみましょう:

{
       listen 80;
       server_name 1.abc.com 2.abc.com;
        root /a/domains/1.abc.com/public_html;
        index index.html index.htm index.shtml index.php;
        error_page  404               /404.html;
    #Custom rules Start
        #Custom rules End
    location = /500.html {
        root   /usr/share/nginx/html;
    }
    location ~ \.php$ {
        fastcgi_pass   unix:/dev/shm/php.sock;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        access_log     /a/apps/nginx/logs/1.abc.com.access.log main;
    }
    location ~ /\.ht {
        deny  all;
    }
}1234567891011121314151617181920212223242512345678910111213141516171819202122232425
ログイン後にコピー

PS: プライバシー保護のため、server_name を自分の server_name に対応する 1.abc.com に変更しました
変更方法を以下に紹介します。 conf を変更する前に覚えておいてください。独自の conf と cp のバックアップ コピーを conf.back として作成してください。
以下は変更方法です:
1. pathinfo をサポートするように php を変更します
conf を変更する前に、php の php.ini ファイルを見つけます (ファイルは、php インストール ディレクトリの etc ディレクトリまたは lib フォルダーにある場合があります)。あなたの設定)、検索:cgi.fix_pathinfo
コメントを解除して 1 に設定します: cgi.fix_pathinfo=1

2 conf を変更する前に明確にしておくべき質問があります。つまり、CI のルート ディレクトリがその場合は、次のように変更します:
以下を追加するだけです:
location ~ .php$ の前に段落を追加します:

    if (!-e $request_filename) {
          rewrite ^.*$ /index.php last;
     }123123
ログイン後にコピー

これは、ブラウザにアクセスしたいファイルが存在しないことを意味します。 Web ルート ディレクトリのindex.php に自動的にルーティングされてアクセスします。
もちろん、上記の段落は次のように置き換えることもできます:

   location / {
        try_files $uri $uri/ /index.php;
    }123123
ログイン後にコピー

完全な構成は次のとおりです:

server{
    listen 80;
    server_name 1.sod90.com app.sod90.com;
    root /a/domains/1.sod90.com/public_html;
    index index.html index.htm index.shtml index.php;
    error_page  404               /404.html;
    #Custom rules Start
        #Custom rules End
        location = /500.html {
        root   /usr/share/nginx/html;
    }    #location / {
    #    try_files $uri $uri/ /index.php;
    #}
     if (!-e $request_filename) {
          rewrite ^.*$ /city52/index.php last;
     }
    location ~ \.php$ {
        fastcgi_pass   unix:/dev/shm/php.sock;
        include        fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        access_log     /a/apps/nginx/logs/app.sod90.com.access.log main;
    }
    location ~ /\.ht {
        deny  all;
    }
}123456789101112131415161718192021222324252627282930313233123456789101112131415161718192021222324252627282930313233
ログイン後にコピー

注: 上記の try_files は rewrite を完全に置き換えることができます。リンクを参照してください
このリダイレクトの追加に加えて、 conf にそれが必要です それに加えて、何か奇妙なものもあります。
次に、CI 構成ファイル内の次の 3 つのパラメーターを確認します:

$config['base_url'] = 'http://1.abc.com/';$config['index_page'] = '';$config[ 'uri_protocol'] = 'REQUEST_URI';123123

これら 3 つのパラメータはより重要です。最初のパラメータは、デフォルト値の 'index.php' ではなく、Web ルート ディレクトリに対応するドメイン名です。上記の後、設定はOKで、URLアドレスにindex.phpを記述する必要はありません

Extension

ここで、バックエンドがアプリとWebをサポートしている場合、異なるフレームワークを使用することが避けられない場合があることを考えてみましょう。すべてのフレームワークがルート ディレクトリに配置されていると見た目が良くありません。CI のルート ディレクトリが Web のルート ディレクトリではなく、public_html の下の xxx フォルダにある場合は、try_files で / をルーティングするだけで済みます。 conf.Index.php のステートメントは、次のように /xxx/index.php に変更できます:

   location / {
        try_files $uri $uri/ /xxx/index.php;
    }123123
ログイン後にコピー

CI の config.php に、

$config['base_url'] = 'http://1.abc.com/';11
ログイン後にコピー

または:

$config['base_url'] = 'http://app.sod90.com/xxx/';11
ログイン後にコピー

と記述します。問題ありませんが、安全のため、base_url には後者を使用し、URL にindex.php を含めない方がよいでしょう。この 2 つの違いは、取得される値にも反映されます。 Base_url() などの CI 関数を使用する場合は異なります。リンクは、より信頼性の高い外部リンクです:

http://stackoverflow.com/questions/8182868/nginx-configuration-avoid-codeigniter-rewrite-rules。

CI の複数のディレクトリ: http://blog.sina.com.cn/s/blog_6ec2ae900101kbx9.html


追加の説明、一般的に言えば、conf 内の次の 3 つの文が重要です:

   fastcgi_param  PATH_INFO $fastcgi_path_info;
    fastcgi_split_path_info ^(.+\.php)(.*)$;
    fastcgi_param  PATH_TRANSLATED $document_root$fastcgi_path_info;123123
ログイン後にコピー

ただし、私は次の文のみを使用しました。私の会議内:

fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
ログイン後にコピー

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート