我正在嘗試從 url 中洗掉任何尾部斜杠。這適用于除主頁之外的任何地方。
這是它的作業原理:
- sub.example.com/ => sub.example.com
- sub.example.com/test/ => sub.example.com/test
- sub.example.com/test/// => sub.example.com/test
這是它不起作用的地方:
- sub.example.com// => sub.example.com//
我的組態檔:
server {
server_name sub.example.com;
root /var/www/example.com/;
index index.php;
charset utf-8;
rewrite ^/(.*)/$ /$1 permanent;
location / {
try_files $uri /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php8.0-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
listen 443 ssl;
#SSL settings
}
uj5u.com熱心網友回復:
看起來你不了解引擎蓋下的一些非常重要的部分。
1. HTTPGET請求不能包含空字串作為路徑。
當您sub.example.com/在瀏覽器地址欄中鍵入時,瀏覽器會隱藏尾部斜杠。這是只為根的請求應用,在任何其他情況下(包括sub.example.com//,sub.example.com/test/,sub.example.com/test//等),你會看到在地址欄的完整路徑。不管你是否輸入斜線,瀏覽器發出的 HTTP 請求看起來像
GET / HTTP/1.1
Host: sub.example.com
...
2. rewritenginx 指令適用于規范化的URI。
兩者location并rewrite用所謂的指導作業規范化的URI:
在對以“%XX”形式編碼的文本進行解碼、決議對相對路徑組件“.”的參考后,對規范化的 URI 執行匹配。和“..”,以及可能將兩個或多個相鄰斜線壓縮成單個斜線。
這意味著,對于像sub.example.com/test/、sub.example.com/test//、sub.example.com/test///等的所有請求,nginx 將規范化的請求 URI 視為/test/(這就是您的重寫規則在一個步驟中而不是四步sub.example.com/test///-> sub.example.com/test//-> sub.example.com/test/->sub.example.com/test回圈中起作用的原因)。
而同樣是對任何真正的sub.example.com/,sub.example.com//,sub.example.com///等請求,標準化的URI將nginx的被視為/作任何重寫規則無法使用。
但是,可以使用merge_slashes指令關閉斜線壓縮(閱讀安全注意事項)。并且為了防止多次重定向,其中每個重定向只洗掉一個尾部斜杠,請為您的正則運算式模式使用非貪婪*和貪婪 量詞:
merge_slashes off;
rewrite ^(/.*?)/ $ $1 permanent;
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/347875.html
標籤:nginx
上一篇:記憶體鍵值快取是否包含參考值?
