次のnginx vhost設定があります。
server {
listen 80 default_server;
access_log /path/to/site/dir/logs/access.log;
error_log /path/to/site/dir/logs/error.log;
root /path/to/site/dir/webroot;
index index.php index.html;
try_files $uri /index.php;
location ~ \.php$ {
if (!-f $request_filename) {
return 404;
}
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME /path/to/site/dir/webroot$fastcgi_script_name;
include /path/to/nginx/conf/fastcgi_params;
}
}
存在するファイルに一致しないすべてのリクエストをindex.phpにリダイレクトしたい。現在のところ、これはほとんどのURIで正常に機能します。次に例を示します。
example.com/asd
example.com/asd/123/1.txt
asd
とasd/123/1.txt
のどちらも存在しないため、index.phpにリダイレクトされ、正常に機能します。ただし、example.com/asd.php
というURLを入力すると、asd.php
が検索され、見つからない場合は、index.php
にリクエストを送信する代わりに404が返されます。
asd.php
が存在しない場合に、index.php
をasd.php
にも送信する方法はありますか?
あなたの追加のコメントに行くと、これはかなり最適な方法ではないようですが、それはかなりの設定ではありません。
server {
listen 80 default_server;
access_log /path/to/site/dir/logs/access.log;
error_log /path/to/site/dir/logs/error.log;
root /path/to/site/dir/webroot;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php;
}
location ~ \.php$ {
try_files $uri @missing;
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include /path/to/nginx/conf/fastcgi_params;
}
location @missing {
rewrite ^ /error/404 break;
fastcgi_pass localhost:9000;
fastcgi_param SCRIPT_FILENAME $document_root/index.php;
include /path/to/nginx/conf/fastcgi_params;
}
}
うわー、私はあなたがそのコードを置き換えたいと思うすべては次のとおりだと思います:
error_page 404 /index.php
...あなたが欲しいものを正しく読んだら。
あなたがしようとしていることは、カスタムエラーページと同じです。これを行うには、nginxのerror_pageプロパティを使用できます。詳細については、リンクをクリックしてください
それは私と一緒に働いた!
location /anyfolder {
error_page 404 /yourhandler.php?fnf=$uri;
}
問題はあなたがあなたの場所で "if"ステートメントと共に "try_files"を使用していることだと思います。ドキュメントから、try_filesはifおよびmod_rewriteスタイルの存在チェックの代替となるはずです。 nginx wikiの「try_files」ページ( http://wiki.nginx.org/HttpCoreModule#try_files ):
"try_filesは基本的に、典型的なmod_rewriteスタイルのファイル/ディレクトリの存在チェックの代わりです。if-see IfIsEvil"を使用するよりも効率的です。
「if」wikiページを確認してください( http://wiki.nginx.org/NginxHttpRewriteModule#if ):
"注:ifを使用する前に、if is evilページを参照して、代わりにtry_filesの使用を検討してください。"
だから、もしチェックしたら削除してみて、 "try_files"のままにしておきましょう。これにより、任意のページ(asd.phpまたは.phpで終了するその他のものを含む)の存在が確認され、見つからない場合はindex.phpにフォールバックする必要があります。
不足しているすべてのphpファイルをカスタム内部/error404
エラーページにリダイレクトしたい。順列中に見つかった解を投稿します。
error_page 404 /error404;
私を助けませんでした。 location
、@missing
、rewrite
、break
の組み合わせもありませんでした。だが
location ~ \.php$ {
# this is it! $fastcgi_script_name points to my url
try_files $fastcgi_script_name = /error404;
fastcgi_pass unix:/var/run/php5-fpm.sock;
fastcgi_param SCRIPT_FILENAME /var/www$fastcgi_script_name;
...
etc.
Richard、Pitfallsガイドによると、nginxとphpの間の潜在的な vulnerability を解決するため、php.iniで「cgi.fix_pathinfo = 0」を設定することが推奨されています。