首页 > 解决方案 > 将 url 重定向到 url 到 www

问题描述

我在 nginx 中将 url 重定向到 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/; }

我检查了测试人员中的正则表达式,一切正常。我正在询问我在哪里犯了错误以及如何解决它,或者例如。

标签: regexlinuxnginxredirectconfiguration

解决方案


URI 后面的部分?是查询字符串(或参数),而不是locationandrewrite指令使用的规范化 URI 的一部分 - 所以你的规则永远不会匹配。有关详细信息,请参阅此文档

如果您有复杂的正则表达式需要匹配整个 URI(包括查询字符串),您需要使用该$request_uri变量。这可以使用 aif或 a进行测试map。对于多个正则表达式,amap是首选解决方案。

例如:

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 块之外。有关详细信息,请参阅此文档


推荐阅读