Nginx 上发生内部重定向错误时重写或内部重定向循环

Nginx 上发生内部重定向错误时重写或内部重定向循环

我刚刚从 Apache 迁移到 Nginx,并尝试设置重写规则。我有一个虚拟主机,这是虚拟主机的结构

/var/www/name-of-virtual-host/
├── wp1
│   ├── wp-admin
│   ├── wp-content
│   └── wp-includes
└── wp2
    ├── wp-admin
    ├── wp-content
    └── wp-includes

如您所见,我在不同的文件夹中安装了 2 个不同的 WordPress。因此,我尝试创建重写规则来处理这两个 WordPress。

这是我的位置定义:

        location / {
                try_files @missing $uri;
        }
        location @missing {
                rewrite ^/([a-z-])(/.*)$ /$1/index.php last;
        }
        location ~ \.php$ {
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

                # With php5-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php5-fpm:
                fastcgi_pass unix:/var/run/php5-fpm.sock;
                fastcgi_index index.php;
                include fastcgi_params;
        }

如果 URI 是/wp1/帖子永久链接/它应该使用/wp1/index.php而如果/wp2/帖子永久链接/它应该使用/wp2/index.php

但我越来越重写或内部重定向循环,同时内部重定向至错误。

我如何编写重写规则以供多个 WP 安装使用?

更新 1

WordPress .htaccess 文件示例:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wp1/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wp1/index.php [L]
</IfModule>

# END WordPress

答案1

你的try_files顺序错误?也许这就是导致您头痛和陷入无限循环的原因,因为文件@missing确实从您的文件系统中丢失了,而重定向回$uri确实会导致无限循环?

-try_files @missing $uri;
+try_files $uri @missing;

尽管如此,如果您只有两个 WordPress 网站,我认为更好的方法可能是简单地进行一点复制粘贴,而不是每次都尝试调用正则表达式。

例如,与尝试进行大量重写和多次重定向相比,以下做法可能更好:

location /wp1 {
    try_files $uri /wp1/index.php;
}
location /wp2 {
    try_files $uri /wp2/index.php;
}

答案2

这立即引起了我的注意:

rewrite ^/([a-z-])(/.*)$ /$1/index.php last;

$1在这种情况下只匹配一个字符。

不过我不会进一步修复这个问题。与其重新发明轮子,不如从推荐的配置开始。否则会有太多陷阱和教训需要学习。 http://codex.wordpress.org/Nginx

相关内容