一些地图杀死了我的 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;