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

发生这种情况是因为$1来自最后执行的正则表达式。由于map{}在重写中检查正则表达式的时间较晚,因此$1来自映射中指定的正则表达式(并且它是空的)。有一个票 564在 nginx trac 中关于这一点 - 虽然行为在形式上是正确的,但它显然是违反直觉的,需要进行更改。

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

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

或者更好的是,只需使用return$request_uri 即可:

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

相关内容