Nginx Serve WordPress从子路径404出现故障,如何修复?

时间:2019-10-15 作者:punkbit

我希望在发布到生产之前,宿主审查分支以进行暂存、测试并获得反馈。我试图遵循一些在线提供的文档,如NGINX配方(https://www.nginx.com/resources/wiki/start/topics/recipes/wordpress/ ) 没有成功!那么,如何修复它呢?

审查分支的模式是/review-xxxxx/review-xx_x-xxx. 因为我已经设置了部署管道,以触发发布到AWS ECSreview-* 分支,这是我想保密的地方,仅供测试和反馈使用。

我打字很难/review-ci 避免对任何regex模式问题进行故障排除,并保持简单易用。所以,你会发现/review-ci NGINX Conf文件中的路径,以便明确目标。

我的NGINX conf文件如下所示:

server {
    listen 80;
    server_name httpwordpress.docker.localhost;

    # Logs
    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    # Default location settings
    location / {
        index index.php;
    }

    location /review-ci {
        index  index.php;
        try_files $uri $uri/ /review-ci/index.php?$args;
    }

    # Pass the PHP scripts to FastCGI server
    location ~ \\.php$ {

        fastcgi_split_path_info ^(.+\\.php)(/.+)$;

        fastcgi_pass php-fpm:9000;
        fastcgi_index   index.php;
        fastcgi_param   SCRIPT_FILENAME 
        $document_root$fastcgi_script_name;
        include         fastcgi_params;
    }


}
我有活动的烫发链接,我应该能够请求foobar.com/review-ci/wp-admin 并查看登录屏幕。

当我这样做的时候curl http://httpwordpress.docker.localhost/review-ci/wp-admin, 我得到:

404 page not found
我也在使用https://github.com/wp-graphql/wp-graphql, 也就是说地址http://httpwordpress.docker.localhost/review-ci/graphql 应该返回一个数据响应,但我得到的是404。

这是在引入regex模式之前的一小步,因为我想将应用程序部署到AWS ECS。我立刻注意到,我原来的设置失败了,我在serverfault(https://serverfault.com/questions/988035/nginx-location-regex-for-prefixed-paths-failure ).

同时,简单地依赖于主机名和根路径(如下面所示)在开发环境中可以很好地工作。但不幸的是,登台可能会有一些并行版本,这些版本具有单独的特性或需求,但尚未准备好发布,并且它是按关注点或“git分支名称”前缀保持独立的review- 如果需要部署并具有staging url.

server {
    listen 80;
    server_name httpwordpress.docker.localhost;

    root /var/www/html;
    index index.php;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    client_max_body_size 200m;

    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    location ~ \\.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\\.php)(/.+)$;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        client_max_body_size 200m;
    }

}
有人知道如何解决这个问题吗?

感谢您的关注,任何反馈或提示都将不胜感激!

2 个回复
SO网友:tranchau

You can try

location /review-ci {
    index  index.php;
    try_files $uri $uri/ /review-ci/index.php;
}
SO网友:punkbit

上面的问题是关于/path-segment 而不是/sub-directory 或在WP社区中通常称为/sub-folder. 经过多次尝试,我建议不要尝试创建/routes 而是将文件托管在/sub-directory 以简化流程。解决方案如下。

由于我试图做的事情没有映射到www$HOME中的目录,所以很难做到。与大多数示例一样,我们在网上找到了“Wordpress in a subfolder”用例演示,通常的做法是将wp源文件存储在相对于www$HOME的位置。因此,我放弃了创建/路由的想法(请注意,它不是子文件夹,它不会映射到目录,例如,www.foobar.com/review-foobar/wp-admin应该是/var/www/home/ 而不是/var/www/home/review-foobar/wp-admin); 我已经测试并发现可以使用regex和捕获组以及NGINX别名;在那里我可以通过小组wp-admin 将零件分段到alias /var/www/home/wp-admin 而不是NGINXtry_filesroot 指令。也许这在这里有点太难理解,但关键是,最好坚持通常的做法,将文件托管在相对于$HOME路径的子目录中,以避免regex和捕获组、回退等。

常用做法的工作版本为:

    server {
        listen PORT;
        server_name httpwordpress.docker.localhost;

        root /var/www/html;
        index index.html index.htm;

        location / {
        try_files $uri $uri/ =404;
        }

        location /review-staging {
            try_files $uri $uri/ /review-staging/index.php?$args;
        }

        location ~ \\.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\\.php)(/.+)$;
            fastcgi_pass FPM_HOSTNAME:9000;
            fastcgi_index index.php;
        }
    }
所以/review-staging 例如,段是$HOME中的目录/var/www/html, WP的源文件位于/var/www/html/review-staging. 请记住,这不是我想要的,但似乎是这里的常见做法,有助于减轻设置时的一些痛苦。

相关推荐

反向代理后nginx上的WordPress多站点子目录

我似乎无法让wordpress多站点子目录在我的反向代理之后工作。本地(从lan ip地址)所有工作正常,我可以访问主域、子目录和所有仪表板。添加反向代理时,我无法访问网络仪表板(重定向循环)或多站点子目录(重定向到lan ip)。如果我试图通过手动写入地址进入多站点,它会将我发送到没有css的页面。唯一可以使用反向代理的是主站点。我想要的:www.example。net www.example。net/wp admin www.example。net/wp admin/network www.examp