Nginx
如何在 nginx 中調試大重定向鏈。意外重定向
我現在的任務是進行大型站點遷移。而且我在配置中有大量重定向。但我不明白為什麼一個重定向會導致鏈中的第二個重定向。即使任何其他重定向評論/禁用。
所以我的位置配置:
server { ... index index.php; location / { try_files $uri $uri/ /index.php?$query_string; } location ~* /index.php { if ($args ~ "^page=flights&start_city=([\+\w\d\s]*)(&.*)?$"){ return 301 $scheme://$server_name/flights?departure_city=$arg_start_city; } if ($is_args){ return 301 $scheme://$server_name/$1; } fastcgi_split_path_info ^(.+\.php)(/.+)$; fastcgi_pass unix:/var/run/php/php7.1-fpm.sock; fastcgi_index index.php; include fastcgi_params; }
我期待什麼?我希望舊連結喜歡
https://example.com/index.php?page=flights&start_city=Berlin&s_loc_lat=&s_loc_long=
變得:
https://example.com/flights?departure_city=Berlin
同時連結如下:
https://example.com/index.php?someoldpar=someoldkey&someoldpar2=someoldkey2
變得:
https://example.com/
測試此配置時我得到了什麼?
. 我得到了第一個連結的重定向鏈:
1. GET https://example.com/index.php?page=flights&start_city=Berlin&s_loc_lat=&s_loc_long= 2. 301 https://example.com/flights?departure_city=Berlin 3. 301 https://example.com/
如何為已重定向的連結排除第 3 步?後端下的 Lavarel。
您的
try_files
語句將 URI 重寫為/index.php
並附加查詢字元串。您的if ($is_args)
語句使用查詢字元串重定向任何 URI。你有一個重定向循環。該
location ~* /index.php
塊無法區分包含的原始請求index.php
和try_files
預設值的結果。您應該對
$request_uri
變數執行測試,該變數將始終包含原始請求和查詢字元串。您可以使用if
或map
。對於多個正則表達式,amap
是首選解決方案。例如:
map $request_uri $redirect { default 0; ~^/index.php\?page=flights&start_city=(?<startcity>[\+\w\d\s]*)(&.*)?$ /flights?departure_city=$startcity; ~^/index.php\? /; } server { ... if ($redirect) { return 301 $redirect; }
您可以刪除您的
location ~* /index.php
塊,因為它不再需要。正則表達式按順序計算,直到找到匹配的規則,因此將最具體的規則排在最前面,最後將最不具體的規則排序。使用命名擷取,因為數字擷取可能超出範圍。如果它們相同,則不需要指定方案或域名。該map
指令位於 `server 塊之外。有關詳細資訊,請參閱此文件。