Nginx RegEx 对多个站点进行重写或内部重定向循环

Posted

技术标签:

【中文标题】Nginx RegEx 对多个站点进行重写或内部重定向循环【英文标题】:Nginx RegEx to multiple sites make rewrite or internal redirection cycle 【发布时间】:2018-07-02 09:49:06 【问题描述】:

我正在尝试将我的应用程序从 Apache 迁移到 nginx。首先,我有 mod_rewrite 模块,它可以像这样自动将我的应用程序重定向到 index.php 页面:

http://127.0.0.1/fwsibe/acesso <- URL displayed

http://127.0.0.1/fwsibe/index.php/acesso <- url accessed

所以,我在我的位置使用带有别名的 try_files 来自动重定向页面并且一切正常,但我有必要为每个应用程序设置一个唯一的位置,使用 RegEx 上的“sibe”一词来捕获所有网站。

每个应用的一个位置有效:

location /fwsibe/ 
    alias       /var/www/fwsibe/;
    try_files   $uri $uri/ /fwsibe/index.php;

location /sibe/ 
    alias       /var/www/sibe/;
    try_files   $uri $uri/ /sibe/index.php;

location /portalsibe/ 
    alias       /var/www/portalsibe/;
    try_files   $uri $uri/ /portalsibe/index.php;

location /sibemovel/ 
    alias       /var/www/sibemovel/;
    try_files   $uri $uri/ /sibemovel/index.php;

但是,当我尝试使用 RegEx 对所有“sibe”应用程序使用唯一位置时,出现“内部重写或内部重定向周期”错误。

location ~ /([a-z]*sibe[a-z]*)/ 
    set         $subdomain          $1;
    alias       /var/www/$subdomain/;
    try_files   $uri $uri/ /$subdomain/index.php;

【问题讨论】:

root /var/www 在所有情况下都可以使用时,为什么还要使用alias 没有别名返回 404 未找到所有 sibe 应用 @mayconfsbrito,看看 cnst 解决方案是否不起作用。然后我会试一试你的问题,否则我认为他发布的内容应该有效 【参考方案1】:

这与try_files 的工作方式有关——http://nginx.org/r/try_files——最后一个参数只是到指定 URL 的内部重定向:

如果没有找到任何文件,则内部重定向到最后一个参数中指定的 uri。

您大概认为您的 try_files 将涉及 .php 处理程序,但是在随后的 location 搜索中发生的事情是您最终处于与开始时完全相同的状态。

根据http://nginx.org/r/location,位置指令的顺序很重要——第一个匹配的正则表达式胜出:

然后检查正则表达式,按照它们在配置文件中出现的顺序。正则表达式的搜索在第一次匹配时终止,并使用相应的配置。

因此,您希望将 .php 放在基于站点的处理程序之前。

【讨论】:

以上是关于Nginx RegEx 对多个站点进行重写或内部重定向循环的主要内容,如果未能解决你的问题,请参考以下文章

如何在nginx创建临时重定向和永久重定向

如何在 Nginx Regex 中重写 URL 并进行调试?

Nginx URL重写(rewrite)配置及信息详解

nginx中的rewrite语句

Firefox 重定向 Nginx 重写

nginx_rewrite