我的项目目录结构如下:
/var/www/mysite/ backend/ frontend/
其中frontend/
包含简单的 html 和 js 文件,backend/
是一个 wordpress 站点。我将 wordpress 数据公开给前端的 REST api 端点。
我希望 mysite.com 显示 html/js 文件,并且所有 REST api 调用都是针对mysite.com/api
wordpress 站点文件的。(所以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;
}
}
答案2
您可以在子文件夹中对 WP 执行以下操作:
location /backend {
rewrite ^(/[^/]+)?(/wp-.*) /backend/$2 break;
rewrite ^/backend/(.*)$ /backend/index.php?q=$1 last;
}