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を記述する必要はありません
location / { try_files $uri $uri/ /xxx/index.php; }123123
$config['base_url'] = 'http://1.abc.com/';11
$config['base_url'] = 'http://app.sod90.com/xxx/';11
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;