Apache への nginx プロキシを使用する場合は、複数のスラッシュとすべての末尾のスラッシュを保持します。

Apache への nginx プロキシを使用する場合は、複数のスラッシュとすべての末尾のスラッシュを保持します。

少し背景を説明します。私は現在、Apache の古いサーバーから、Apache への NGINX プロキシを備えた新しい Ubuntu サーバーに Web サイトを移行中です。Web サイトのコードベースが古いサーバーと新しいサーバーの両方で実行される移行期間があります。

ウェブサイトには、スラッシュで区切られたフィルター付きの検索URLがあり、多くの場合オプションです。例:

www.example.com/search/deals/q1/q2/q3/q4/q5/q6/

これは次の apache.conf 書き換えルールにマッピングされます。

RewriteRule ^/search/deals/(.*)/(.*)/(.*)/(.*)/(.*)/(.*)/  /results.php?q1=$1&q2=$2&q3=$3&q4=$4&q5=$5&q6=$6 [L,QSA]

以下のようなURLは珍しくありません

www.example.com/search/deals/q1////q5/q6/

www.example.com/search/deals/q1/q2/q3///q6/

www.example.com/search/deals/q1/q2/q3/q4///

新しいサーバーでは、NGINXを次のように構成しました。2つのサイトで、デフォルトのサーバーapacheファイルとexample.comファイルを有効にしました。

/etc/nginx/sites-enabled/apache -> ../sites-available/apache
/etc/nginx/sites-enabled/example.com -> ../sites-available/example.com

apache は次のようになります (実際の IP は 10.10.10.10 に置き換えられます) :

server {
    listen 10.10.10.10:80 default_server;
    merge_slashes off; #have tried with/without

    location / {
        proxy_redirect off; #have tried with/without
        port_in_redirect off; #have tried with/without
        proxy_pass http://10.10.10.10:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

example.comは次のようになります

server {
        listen 10.10.10.10:80 ;
        server_name example.com www.example.com;
        root /var/www/live/example.com/frontend/htdocs;
        merge_slashes off;

    location / {
        fastcgi_pass unix:/var/run/php5-fpm.sock; #have tried with/without
        include fastcgi_params; #have tried with/without


        proxy_redirect off; #have tried with/without
        port_in_redirect off; #have tried with/without
        proxy_pass http://10.10.10.10:8080 ;
        proxy_set_header Host             $host;
        proxy_set_header X-Real-IP        $remote_addr;
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;#have tried with/without
        proxy_set_header X-Accel-Internal /internal-nginx-static-location; #have tried with/without
        access_log off;
    }

}

変更を加えた後は、NGINXを再起動します。

service nginx restart

たとえば、www.example.com/search/deals/q1/q2////q6/ のページをロードすると、「ファイルが見つかりません」というメッセージが表示され、ログ レベルを 3 に設定して Apache ログを確認すると、次のメッセージが表示されます。

[Wed Oct 07 22:52:10.178436 2015] [rewrite:trace1] [pid 4186:tid 123456789] mod_rewrite.c(468): [client 10.10.10.10:33468] 10.10.10.10 - - [www.example.com/sid#sddsaddsa][rid#sddsaddsa/subreq] pass through /search/deals/q1/q2/q5/

これは、複数のスラッシュがすべてプロキシ経由で削除されたことを示しています。ただし、Apache ルールがパラメータを正しくルーティングできるように、URL をそのままにしておく必要があります。

同様のタイトルの他の回答を見ましたが、どれも私の問題を解決しませんでした。例: 乗客と作業するときは二重スラッシュを維持してください

https://stackoverflow.com/questions/4320774/nginx-urls に二重スラッシュを入れる方法

https://stackoverflow.com/questions/14832780/nginx-merge-slashes-redirect

https://stackoverflow.com/questions/22759345/nginx-trailing-slash-in-proxy-pass-url

https://stackoverflow.com/questions/5834025/how-to-preserve-request-url-with-nginx-proxy-pass

...

どなたか何か提案があったり、正しい方向を指し示していただけるとありがたいです。

前もって感謝します

関連情報