nginx 配置 try_file,根据目标文件是否存在进行条件重写

nginx 配置 try_file,根据目标文件是否存在进行条件重写

我正在使用如下所示的设置将所有未找到的文件重定向到单个后备位置

  location / {
      try_files $uri @missing;
  }

  location @missing {
      rewrite ^(.*)$ /fallback.php last;
  }

这很有效,但我现在有一个更复杂的要求,因为我实际上需要回退到我的后备。

所以 - 我需要扩展它,以便如果 fallback.php 不存在它会重写为 fallback2.php

更新:

下面是我的配置文件的其余部分,按照@AD7six 在评论中的建议,用 try_files 行编写,以防 php 处理程序出现问题:

server {
    listen 80 default_server;
    listen [::]:80 default_server ipv6only=on;

    server_name ~^(?<subdomain>\w*?)?\.?(?<domain>\w+\.\w+)$;

    if ($subdomain = "") {
            set $subdomain "www";
    }

    if (!-d "/home/me/projects/$domain/$subdomain") {
            set $subdomain "www";
    }

    root /home/me/projects/$domain/$subdomain;
    index index.php index.html index.htm;

    location / {
            try_files $uri /fallback.php /fallback2.php;
    }

    location ~ \.php$ {
            try_files $uri $uri/ =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass unix:/var/run/php5-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
    }
}

如果我在 try_files 行中只有一个位置它就可以工作:

try_files $uri /fallback.php;

但当我在第二个位置时,它会下载 fallback.php html,而不是重定向

try_files $uri /fallback.php /fallback2.php;

答案1

location = /fallback.php {
    if (!-e $request_filename) {
        [...]
    }
}

注意:如果您有 *.php 的正则表达式位置,则它们将优先。

相关内容