Nginx-すべてのリクエストを単一のスクリプトにルーティングします


11

スクリプトルーティングを処理し、あらゆる種類の派手なことを行うPHPスクリプトがあります。元々はApache用に設計されていましたが、いくつかのボックスのためにnginxに移行しようとしています。今、私はテストサーバーで物事をスムーズにしようとしています。

したがって、スクリプトの動作方法は、.htaccessファイルを使用して(Apache内の)ディレクトリのすべてのHTTPトラフィックをインターセプトすることです。これは次のようなものです。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.+$ index.php [L]
</IfModule>

とても簡単です。すべてのリクエストはindex.php、単純でシンプルに実行されます。

私はnginxでその動作を模倣したいと思っていますが、まだ方法が見つかりません。誰か提案がありますか?

nginx.conf現時点での私のファイルのコピーです。それが私がそれをただ動かそうとするのを試みるために設計されたことに注意してください。主にコピー/貼り付けジョブ。

user www-data;
worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
    # multi_accept on;
}

http {
        include         /etc/nginx/mime.types;
        default_type    text/plain;
        include         /etc/nginx/conf.d/*.conf;
        server {
                listen          80;
                server_name     swingset.serverboy.net;

                access_log      /var/log/nginx/net.serverboy.swingset.access_log;
                error_log       /var/log/nginx/net.serverboy.swingset.error_log warn;

                root            /var/www/swingset;

                index           index.php index.html;
                fastcgi_index   index.php;

                location ~ \.php {
                        include /etc/nginx/fastcgi_params;
                        keepalive_timeout 0;
                        fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                        fastcgi_pass    127.0.0.1:9000;
                }
        }
}

回答:


13

これを追加、

 location / {
                    try_files $uri $uri/ /index.php;
            }

それがすることは、最初に実際のファイル/フォルダとして$ uriと$ uri /の存在をチェックし、それらが存在しない場合は/index.phpを通過するだけです(つまり、インデックスを介してルーティングが行われるZendフレームワークのセットアップです) .php)-もちろん、パラメータを渡す必要がある場合は、/ index.phpに最後に?q =を追加するだけで、パラメータが渡されます。

try_fileディレクティブがバージョン0.7.27以降で使用可能であることを確認してください。


7

私は自分でそれを考え出した!うん!

locationブロックに必要なのは次のとおりです。

location /  {
    include /etc/nginx/fastcgi_params;
    fastcgi_param   SCRIPT_FILENAME  $document_root/index.php;
    fastcgi_pass    127.0.0.1:9000;
}

他のすべてはほぼ同じままでした。


以下に書いたことを試してみましたか?また、すべての静的ファイルがindex.phpを通過することを意味します-必要かどうかはわかりません。
アダムBenayoun

@アダム:ええ、あなたのコードを試しました。すべてをindex.phpで実行したかった。でもありがとう!
マットバスタ

2

GET引数を保持するには、次を使用します。

location / {
    try_files $uri $uri/ /index.php$is_args$args;
}

$ is_argsは「?」になります $ argsが空でない場合

またはさらに簡単:

location / {
    try_files /index.php$is_args$args;
}

1

ルートディレクトリを設定した後、これを追加します

if (!-e $request_filename)
{
    rewrite ^/(.*)$ /index.php?/$1 last;
    break;
}

query_stringをindex.phpにルーリングする必要があるため、必要に応じて正規表現を変更できます。


4
if彼が求めていることを達成するよりも良い方法があります。wiki.nginx.org/IfIsEvil
イシウス

0

ターゲットがPHPファイルの場合に注意すべき非常に重要な落とし穴の1つは、使用するreturn/ rewriteルールがlocation ~ \.phpディレクティブに優先しないようにすることです。この場合、nginxはPHPファイルをレンダリングせずに提供し、PHPソースコードを公開します。これは壊滅的です。

最も安全な方法はすでに提供されていますが、 location / { try_files $uri $uri/ /index.php; }

またindex index.php、必ずlocation /ブロックで設定location ~ \.phpし、デフォルトの構成ファイルに含まれているブロックのコメントを外してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.