【发布时间】:2015-04-03 01:16:54
【问题描述】:
目前我通过为 nginx 定义以下服务器块将所有 http 流量路由到 https。
server {
listen 80;
server_name someserver.xyz www.someserver.xyz;
rewrite ^ https://someserver.xyz$request_uri? permanent;
}
server {
listen 443;
server_name someserver.xyz;
location / {
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffer_size 8k;
proxy_http_version 1.1;
proxy_read_timeout 900;
proxy_connect_timeout 900;
proxy_pass http://desktop_upstream;
proxy_redirect off;
}
}
但是,对于特定的 url 模式,我不希望将 http 流量路由到 https:
http://someserver.xyz/s/[anything]
例如。 http://someserver.xyz/s/blah 不会从 http 重写为 https。像http://someserver.xyz/dude、http://someserver.xyz/s 等其他任何东西仍然会重写。
我尝试修改 rewrite 指令中的正则表达式(以匹配除上述模式之外的所有内容)以及在第一个服务器块中添加一个位置块:
server {
listen 80;
server_name someserver.xyz www.someserver.xyz;
rewrite ^.+\.xyz\/(?!s\/).* https://someserver.xyz$request_uri? permanent;
location / {
proxy_next_upstream error timeout http_500 http_502 http_503 http_504;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_buffer_size 8k;
proxy_http_version 1.1;
proxy_read_timeout 900;
proxy_connect_timeout 900;
proxy_pass http://desktop_upstream;
proxy_redirect off;
}
}
这个新的服务器块有时会将所有 http 流量重写为 https(所有模式),有时不会将任何 http 流量重写为 https。
我知道正则表达式在我测试过的情况下有效。我想象的http流量发生的是:
命中第一个服务器块,判断是否重写为https。
如果它确实重写,它将命中第二个服务器块并转到第二个服务器块的位置。
如果不重写,它将转到第一个服务器块的位置。
我在这里做错了吗?感谢您的帮助!
【问题讨论】:
标签: regex nginx url-rewriting rewrite pcre