我现在有一个任务,要进行大规模网站迁移。而且我的配置中有大量重定向。但我不明白为什么一个重定向会导致链中的第二个重定向。即使任何其他重定向都被注释/禁用。
所以我的位置配置是:
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。
答案1
您的try_files
语句将 URI 重写为查询字符串/index.php
并附加查询字符串。您的if ($is_args)
语句使用查询字符串重定向任何 URI。您有一个重定向循环。
该location ~* /index.php
块无法区分包含的原始请求index.php
和默认的结果try_files
。
您应该对变量执行测试$request_uri
,该变量将始终包含原始请求和查询字符串。您可以使用if
或 a 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 块之外。请参阅这个文件了解详情。