在configuration文件中有多个条件

我想要return 301 https://$host$request_uri; 仅在less数情况下才能执行。 我知道nginx不支持&&或|| 在条件和这对我来说是一个问题。

我托pipe一个Rails应用程序,添加SSL支持的最简单的方法,并强制我的用户总是使用https是通过更改我的configuration

 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 。 所以我想出了这个configuration:

 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自动将任何人redirect到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; 

我不满意,看起来pipe理不好,所以我一直在寻找更好的解决scheme。 我发现这个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; } 

会这样的工作吗? 而且会比我最初的解决scheme好吗?

使用像这样的configuration:

 server { listen 80; server_name mydomain.tld; root /path/to/webroot; location / { return 301 https://$host$request_uri; } location ~ /(?:typo3|mailimage|ical)/ { } } 

第二个位置expression式与正则expression式格式中的任意一个位置匹配,并避免应用于所有其他位置的redirect。