如何配置 Nginx 以在子文件夹中加载 wordpress 网站?(用于 api 调用)

如何配置 Nginx 以在子文件夹中加载 wordpress 网站?(用于 api 调用)

我的项目目录结构如下:

/var/www/mysite/ backend/ frontend/

其中frontend/包含简单的 html 和 js 文件,backend/是一个 wordpress 站点。我将 wordpress 数据公开给前端的 REST api 端点。

我希望 mysite.com 显示 html/js 文件,并且所有 REST api 调用都是针对mysite.com/apiwordpress 站点文件的。(所以mysite.com/api/wp-admin也能正常工作)。

我在配置 nginx 以实现此目的时遇到了麻烦。这是我当前的配置:

server {
  listen                *:80;

  server_name           mysite.com www.mysite.com;

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

  root  /var/www/mysite/frontend;

  location / {
    index  index.html index.htm index.php;
  }

location ^~ /api {
    root /var/www/mysite/backend;

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

    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;
    }
}

  sendfile off;
}

当我尝试访问 URL mysite.com/api 时,这只会从 wordpress 下载 index.php 文件。任何帮助都值得感激,谢谢。

答案1

根本问题是您的配置假定 WordPress 安装在/var/www/mysite/backend/api。使用root指令时,URI 前缀始终是本地路径名的一部分。

使用alias指令从路径名中删除/api元素。例如:

location ^~ /api {
    alias /var/www/mysite/backend;

    index index.php;
    if (!-e $request_filename) { rewrite ^ /api/index.php last; }

    location ~ \.php$ {
        if (!-f $request_filename) { return 404; }

        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $request_filename;
        fastcgi_pass 127.0.0.1:9000;
    }
}

try_files由于alias这个原因,我们避免使用长期存在的问题。 看这种警告关于使用if

答案2

您可以在子文件夹中对 WP 执行以下操作:

    location /backend {
            rewrite ^(/[^/]+)?(/wp-.*) /backend/$2 break;
            rewrite ^/backend/(.*)$ /backend/index.php?q=$1 last;
    }

相关内容