nginx.conf重定向多个条件

jtw3ybtb  于 2023-03-01  发布在  Nginx
关注(0)|答案(7)|浏览(371)

我想在两个条件下使用Nginx重定向请求。
这是行不通的:

if ($host = 'domain.example' || $host = 'domain2.example'){
    rewrite ^/(.*)$ http://www.domain.example/$1 permanent;
  }

正确的做法是什么?

mmvthczy

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;
}
xqkwcwgp

xqkwcwgp2#

正确的方法是使用专用服务器进行重定向:

server {
  server_name domain.example domain2.example;
  rewrite ^ http://www.domain.example$request_uri? permanent;
}
nom7f22z

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;
}

因此它会将所有内容重定向到一个特定的内容,但我猜这是基于用例的

b09cbbtk

b09cbbtk4#

下面是一个声明式方法:

server {
    listen       80;
    server_name  `domain.example` `domain2.example`;
    return 301 $scheme://www.domain.example$uri;
}

server {
    listen       80  default_server;
    server_name  _;
    #....
}
watbbzwu

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;
    }
mrfwxfqh

mrfwxfqh6#

我认为最简单的方法就是使用正则表达式:

if ($host ~ "domain.example|domain2.example") {
    rewrite ^/(.*)$ http://www.example.com/$1 permanent;
}

但只有当你只有弦的时候它才是好的对于复杂的逻辑来说,当然是不正确的。

roqulrg3

roqulrg37#

另一个版本是将其Map到一个字符串,然后通过正则表达式求值。在本例中,if条件为:$arg_version && $request_method = "GET"

map "$arg_version:$request_method" $bypass_cache {
  default 1;
  ~^(.+):GET$ 0;
}

location /  {
  if ($bypass_cache = 0) {
      expires max;
  }
  ...  
}

相关问题