Nginx 配置无法与子目录中的 wordpress 配合使用

Nginx 配置无法与子目录中的 wordpress 配合使用

我有一个 nginx 安装,我需要它来托管开发中的网站,以便其他人可以测试它们。

现在我已经为单个子域设置了一个虚拟主机,并在该目录中对应该开放以供测试的项目进行了符号链接。如您所见,我限制了对整个网站的访问,但对特定目录启用了访问,但使用简单的 auth_basic 将其保持私密。

PHP 可以运行,但除了 / 或 /wp-admin/ 之外的所有内容都会出现 404 错误,所有其他永久链接都会出现 404 错误。我已尽一切努力让它正常工作,但我不知道我做错了什么。请指出我在以下配置中的错误:

server {
  listen 80;
  server_name dev.example.com;
  client_max_body_size 20m;
  server_tokens off;

  root /srv/dev.example.com;
  index index.php index.html index.htm;

  location / {
    deny all;
  }

  location /my-site {
    allow all;

    try_files $uri $uri/ /index.php?$args;

    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/auth.d/.htpasswd-my-site;

    location ~ \.php$ {
      include fastcgi_params;
      fastcgi_index index.php;
      fastcgi_pass php5-fpm-sock;
      fastcgi_param SCRIPT_FILENAME $request_filename;
      fastcgi_intercept_errors on;
      fastcgi_param HTTPS $https;
    }
  }
}

谢谢你!

更新:

该请求将起作用:http://dev.example.com/my-site/,它将导致加载文件/srv/dev.example.com/my-site/index.php

对 wordpress 管理界面的请求也可以工作:http://dev.example.com/my-site/wp/wp-admin,也直接转到索引文件:/srv/dev.example.com/my-site/wp/wp-admin/index.php。管理界面内的所有内容都可以正常工作,因为它不使用永久链接,而是使用原始的 GET 输入。

但是,当我尝试加载永久链接时(我使用最简单的格式/%postname%/),它无法找到它,并且 try_files 指令location /my-site {}应该匹配它们。这意味着以下路由不起作用:

http://dev.example.com/my-site/about
http://dev.example.com/my-site/contact
http://dev.example.com/my-site/etc

答案1

我假设您的文件系统上不存在以下文件:

/srv/dev.example.com/my-site/about/index.{php,html,htm}
/srv/dev.example.com/my-site/contact/index.{php,html,htm}
/srv/dev.example.com/my-site/etc/index.{php,html,htm}

您的问题在于,您的 php 后备位置嵌套在/my-site位置内,并且该try_files指令可能无法按您预期的方式工作。

事实上,try_files接受以下任一作为最后一个参数:

  1. URI
  2. 命名位置
  3. HTTP 代码

对于选项 1 和 2,这意味着内部重定向到指定元素。在您的情况下,/index.php?$args被解释为 URI,如果缺少$uri$uri/$uri/index.php$uri/index.html, ...$uri/index.htm

现在,另一件事是:您使用嵌套位置来处理 php 文件处理。但由于您的try_files最后一个参数是/index.php?$argsURI,它与顶点位置不匹配,/my-site因此它由服务器块处理,如果 URI 无法解析为本地文件,那么您最终会得到 HTTP 404 回复。

请注意,该index指令还将暗示内部重定向到指定的索引文件,但由于 URI 以此开头,/my-site因此它将始终落在您的 php 位置。

因此,您必须将此位置移动到与其他位置相同的级别,或者在您的try_filesURI 前加上您的 apex 位置的前缀,并确保 php 文件位于正确的位置。

相关内容