我在将 url 重定向到 nginx 中的 url 时遇到问题:
例如我有一个链接:
https://example.com/oferty-specjalne/szczegoly-oferty?OfferID=124296
工作函数:
location ^/oferty-specjalne/szczegoly-oferty(.*)$ {
return 301 https://example.com/oferty-specjalne/; }
不工作的功能:
location ~ ^/oferty-specjalne/szczegoly-oferty\?OfferID=(124170|124296|124299|123483|63788|97002)$ {
return 301 https://example.com/oferty-specjalne/; }
location ~ ^/oferty-specjalne/szczegoly-oferty?OfferID=(.*)$ {
return 301 https://example.com/oferty-specjalne/$1; }
location ^/oferty-specjalne/szczegoly-oferty?OfferID=97002 {
return 301 https://example.com/oferty-specjalne/; }
我检查了测试仪中的正则表达式,一切正常。 我正在询问我在哪里犯了错误以及如何解决它的信息,或者例如。
最佳答案
?
之后的 URI 部分是查询字符串(或参数),不是 location
和 rewrite 使用的规范化 URI 的一部分
指令 - 所以你的规则永远不会匹配。参见 this document了解详情。
如果您有需要匹配整个 URI(包括查询字符串)的复杂正则表达式,您需要使用 $request_uri
变量。这可以使用 if
或 map
进行测试。对于多个正则表达式,map
是首选解决方案。
例如:
map $request_uri $redirect {
default 0;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=(124170|124296|124299|123483|63788|97002)$
/oferty-specjalne/;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=(?<offerid>.*)$ /oferty-specjalne/$offerid;
~^/oferty-specjalne/szczegoly-oferty\?OfferID=97002 /oferty-specjalne/;
~^/oferty-specjalne/szczegoly-oferty /oferty-specjalne/;
}
server {
...
if ($redirect) {
return 301 $redirect;
}
正则表达式按顺序求值,直到找到匹配的规则,因此将最具体的规则排在最前面,最不具体的最后。
使用命名捕获,因为数字捕获可能超出范围。
如果方案或域名相同,则无需指定。
map
指令位于 `server block 之外。
参见 this document了解详情。
关于regex - 将 url 重定向到 url 到 www,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53758629/