regex - 将 url 重定向到 url 到 www

标签 regex linux nginx redirect configuration

我在将 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 部分是查询字符串(或参数),不是 locationrewrite 使用的规范化 URI 的一部分 指令 - 所以你的规则永远不会匹配。参见 this document了解详情。

如果您有需要匹配整个 URI(包括查询字符串)的复杂正则表达式,您需要使用 $request_uri 变量。这可以使用 ifmap 进行测试。对于多个正则表达式,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/

相关文章:

Java 缓存 String.split 正则表达式

nginx - 在 bash 脚本之后让 Nginx 保持事件状态

Linux Awk 代码帮助

linux - ubuntu 是否使用 'DS' 和 'SS' 段?

django - Amazon Linux EC2实例上的uWSGI安装异常

PHP API 脚本速度极慢

php - 使用 php,如何将 [0-9]、[0-9] 替换为 [0-9][0-9]?

java - 正则表达式匹配数字后跟空格

regex - 为什么Notepad++中的[[:alpha:]]也匹配中文单词?

linux - 在Redhat中root登录必须是su而不是直接登录,如何设置?