web-dev-qa-db-ja.com

Nginxに、存在しないファイルに対するすべてのリクエストを単一のphpファイルにリダイレクトさせるにはどうすればよいですか?

次の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

asdasd/123/1.txtのどちらも存在しないため、index.phpにリダイレクトされ、正常に機能します。ただし、example.com/asd.phpというURLを入力すると、asd.phpが検索され、見つからない場合は、index.phpにリクエストを送信する代わりに404が返されます。

asd.phpが存在しない場合に、index.phpasd.phpにも送信する方法はありますか?

7
Richard

あなたの追加のコメントに行くと、これはかなり最適な方法ではないようですが、それはかなりの設定ではありません。

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;
    }
}
10

うわー、私はあなたがそのコードを置き換えたいと思うすべては次のとおりだと思います:

error_page 404 /index.php

...あなたが欲しいものを正しく読んだら。

3
user15590

あなたがしようとしていることは、カスタムエラーページと同じです。これを行うには、nginxのerror_pageプロパティを使用できます。詳細については、リンクをクリックしてください

http://wiki.nginx.org/HttpCoreModule#error_page

2
Sameer

それは私と一緒に働いた!

    location /anyfolder {
        error_page 404 /yourhandler.php?fnf=$uri;
    } 
1
Trieu Ngo

問題はあなたがあなたの場所で "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にフォールバックする必要があります。

1
danakim

不足しているすべてのphpファイルをカスタム内部/error404エラーページにリダイレクトしたい。順列中に見つかった解を投稿します。

error_page 404 /error404;

私を助けませんでした。 location@missingrewritebreakの組み合わせもありませんでした。だが

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.
0
vladkras

Richard、Pitfallsガイドによると、nginxとphpの間の潜在的な vulnerability を解決するため、php.iniで「cgi.fix_pathinfo = 0」を設定することが推奨されています。

0
Roger