使用 nginx 代理 apache 時保留多個斜杠和所有尾部斜杠

使用 nginx 代理 apache 時保留多個斜杠和所有尾部斜杠

所以有一點背景。我正在將網站從使用 Apache 的舊伺服器遷移到使用 NGINX 代理到 Apache 的新 Ubuntu 伺服器。將有一個過渡期,網站程式碼庫將在新舊伺服器上運行。

該網站具有帶有過濾器的搜尋 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,如下所示:兩個網站啟用了預設伺服器 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/ 時,我得到“文件未找到”,然後查看 Apache 日誌,日誌等級設定為 3,我得到以下結果:

[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/

這表明所有多個斜杠已在某個時刻通過代理被刪除。但我需要 URL 保持完整,以便 Apache 規則可以正確路由參數。

我查看了具有類似標題的其他答案,但沒有一個解決我的問題,例如: 與乘客合作時保持雙斜杠

https://stackoverflow.com/questions/4320774/nginx-how-to-keep-double-slashes-in-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

如果有人有任何建議或可以指出我正確的方向,那就太好了?

先致謝

相關內容