我希望return 301 https://$host$request_uri;
只在少数情况下执行。我知道 nginx 不支持条件中的 && 或 ||,这对我来说是个问题。
我托管一个 rails 应用程序,添加 SSL 支持并强制我的用户始终使用 https 的最简单方法是将我的配置更改为
server {
listen <my ip>:80;
server_name mydomain.tld;
return 301 https://$host$request_uri;
}
...
upstream my_backend {
server 127.0.0.1:9005;
}
server {
listen <my ip>:443;
server_name mydomain.tld;
ssl on;
....
location / {
proxy_pass http://my_backend;
}
}
这工作正常,但是我们的一个大客户使用 Lotus Notes,当他们阅读引用类似资源的新闻通讯时<img src="https://mydomain.tld/some-image.png" />
,他们无法看到任何内容,因为 IE 在后台呈现,他们的旧 IE 版本不支持 SNI,IE 拒绝呈现图像,一切看起来都很乱。
因此,我决定在新闻通讯中不引用“到”,https
而是http
引用“到”。因此,我想出了以下配置:
server {
listen <my ip>:80;
server_name mydomain.tld;
location / {
proxy_pass http://my_backend;
}
set $redir_to_ssl '';
if ( $request_uri !~ ^/typo3/ ) {
set $redir_to_ssl "${redir_to_ssl}1";
}
if ( $request_uri !~ ^/mailimage/ ) {
set $redir_to_ssl "${redir_to_ssl}1";
}
if ( $request_uri !~ ^/ical$ ) {
set $redir_to_ssl "${redir_to_ssl}1";
}
if ( $redir_to_ssl = "111" ){
return 301 https://$host$request_uri;
}
}
我仍然希望 nginx 自动将任何人重定向到该https
网站,除非URI 以 /typo3 或 /mailimage 或 /ical 开头。
所以我需要这样的东西
if ( URI does not start with /typo3 AND URI does not start with /mailimage AND ... )
return 301 https://$host$request_uri;
我对此并不满意,它看起来管理得不太好,所以我一直在寻找更好的解决方案。我找到了这个Nginx if 语句中的多个条件非常有趣,它看起来更干净。我应该使用它吗?怎么用?
所以?
server {
....
location /typo3 {
proxy_pass http://my_backend;
}
location /mailimage {
proxy_pass http://my_backend;
}
location /ical {
proxy_pass http://my_backend;
}
return 301 https://$host$request_uri;
}
这样的办法可行吗?它会比我最初的解决方案更好吗?
答案1
使用如下配置:
server {
listen 80;
server_name mydomain.tld;
root /path/to/webroot;
location / {
return 301 https://$host$request_uri;
}
location ~ /(?:typo3|mailimage|ical)/ {
}
}
第二个位置表达式将这两个位置中的任意一个与正则表达式格式进行匹配,并避免对所有其他位置进行重定向。