我想在两个条件下使用Nginx重定向请求。这是行不通的:
if ($host = 'domain.example' || $host = 'domain2.example'){ rewrite ^/(.*)$ http://www.domain.example/$1 permanent; }
正确的做法是什么?
mmvthczy1#
我以前遇到过同样的问题,因为Nginx不能处理复杂的条件或嵌套的if语句,所以你需要计算两个不同的表达式。将变量设置为某个二进制值,然后在两个不同的if语句中,如果任一条件为真,则启用:
set $my_var 0; if ($host = 'domain.example') { set $my_var 1; } if ($host = 'domain2.example') { set $my_var 1; } if ($my_var = 1) { rewrite ^/(.*)$ http://www.domain.example/$1 permanent; }
xqkwcwgp2#
正确的方法是使用专用服务器进行重定向:
server { server_name domain.example domain2.example; rewrite ^ http://www.domain.example$request_uri? permanent; }
nom7f22z3#
另一种可能性是
server_name domain.example domain2.example; set $wanted_domain_name domain.example; if ($http_host != $wanted_domain_name) { rewrite ^(.*)$ https://$wanted_domain_name$1; }
因此它会将所有内容重定向到一个特定的内容,但我猜这是基于用例的
b09cbbtk4#
下面是一个声明式方法:
server { listen 80; server_name `domain.example` `domain2.example`; return 301 $scheme://www.domain.example$uri; } server { listen 80 default_server; server_name _; #.... }
watbbzwu5#
server { listen 80; server_name www.wanted_domain.example wanted_domain.example www.un_wanted_domain.example un_wanted_domain.example; if ($host = 'un_wanted_domain.example'){ return 301 $scheme://www.wanted_domain.example$request_uri; } if ($host = 'www.un_wanted_domain.example'){ return 301 $scheme://www.wanted_domain.example$request_uri; }
mrfwxfqh6#
我认为最简单的方法就是使用正则表达式:
if ($host ~ "domain.example|domain2.example") { rewrite ^/(.*)$ http://www.example.com/$1 permanent; }
但只有当你只有弦的时候它才是好的对于复杂的逻辑来说,当然是不正确的。
roqulrg37#
另一个版本是将其Map到一个字符串,然后通过正则表达式求值。在本例中,if条件为:$arg_version && $request_method = "GET"
$arg_version && $request_method = "GET"
map "$arg_version:$request_method" $bypass_cache { default 1; ~^(.+):GET$ 0; } location / { if ($bypass_cache = 0) { expires max; } ... }
7条答案
按热度按时间mmvthczy1#
我以前遇到过同样的问题,因为Nginx不能处理复杂的条件或嵌套的if语句,所以你需要计算两个不同的表达式。
将变量设置为某个二进制值,然后在两个不同的if语句中,如果任一条件为真,则启用:
xqkwcwgp2#
正确的方法是使用专用服务器进行重定向:
nom7f22z3#
另一种可能性是
因此它会将所有内容重定向到一个特定的内容,但我猜这是基于用例的
b09cbbtk4#
下面是一个声明式方法:
watbbzwu5#
将多个域重写为单个域,避免浏览器中出现循环情况。
mrfwxfqh6#
我认为最简单的方法就是使用正则表达式:
但只有当你只有弦的时候它才是好的对于复杂的逻辑来说,当然是不正确的。
roqulrg37#
另一个版本是将其Map到一个字符串,然后通过正则表达式求值。在本例中,if条件为:
$arg_version && $request_method = "GET"