带有正则表达式的nginx映射吃了我的URI

前端之家收集整理的这篇文章主要介绍了带有正则表达式的nginx映射吃了我的URI前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
一些地图杀了我的URI,我不明白为什么:
map $http_cookie $redir_scheme {
    default http;
    ~some=value https; # here is the SSL cookie
}
server {
    listen       8888;
    server_name  redir.*;

    expires -1;
    add_header Last-Modified "";

    location / {
        rewrite ^/(.*)$$redir_scheme://example.com/$1 redirect;
    }
}

Curl提供没有URI的重定向

$curl -giH 'Host: redir.somedomain.com' 'localhost:8888/some/path/with/meaningful/data' -H 'Cookie: some=value'
(...)
Location: https://example.com/
(...)

但是当我将配置更改为:

map $http_cookie $redir_scheme {
    default http;
    some=value https; # here is the SSL cookie
}
server {
    listen       8888;
    server_name  redir.*;

    expires -1;
    add_header Last-Modified "";

    location / {
        rewrite ^/(.*)$$redir_scheme://example.com/$1 redirect;
    }
}

Curl提供了一个带有URI的重定向

$curl -giH 'Host: redir.somedomain.com' 'localhost:8888/some/path/with/meaningful/data' -H 'Cookie: some=value'
(...)
Location: https://example.com/some/path/with/meaningful/data
(...)

我想第一个解决方案真的很蠢,但我不明白为什么.
你有光吗?

这是因为$1来自最后执行的正则表达式.由于map {}的检查晚于重写中的正则表达式,因此$1来自地图中指定的正则表达式(并且它是空的). Nginx trac中有一个关于此的 ticket 564 – 虽然行为是正式的,但它显然是反直觉的,需要改变.

作为一种解决方法,您可以使用命名捕获:

rewrite ^/(?<rest>.*)$$redir_scheme://example.com/$rest redirect;

或者,更好的是,只需使用$request_uri返回:

return 302 $redir_scheme://example.com$request_uri;

猜你在找的正则表达式相关文章