如何通过同一个 PHP 文件处理来自子路径的所有请求?
How to serve all requests from a subpath through the same PHP file?
我正在努力尝试让以下设置在我的机器和 Heroku 上运行:
- 主要页面是 PHP 位于文档根目录中的文件
root/api
下面有一个 API。所有对 /api/*
的请求都应转发到其网关文件 (api/index.php
)。
我在本地使用了不同的 conf 文件(如下),但在 Heroku 上没有任何工作正常。我能想到的最好的是:
location / {
try_files $uri $uri/ /index.php?$query_string;
index index.php;
}
location ~ ^/api/(.+) {
try_files /api/index.php /api/index.php;
}
location ~ \.php(/|$) {
try_files @heroku-fcgi @heroku-fcgi;
}
如果我尝试使用重写,它会抱怨无限循环。如果我尝试将网关脚本设置为 index
并使用 try_files
及其 FCGI 位置,我会得到 404 - 因为除了该脚本之外 /api
文件夹下没有任何内容。
使用 try_files
并直接指向脚本使 Heroku 直接发送 .php 文件进行下载而不是解释它。我怎样才能让它被解释,并且仍然覆盖所有其他 /api/*
请求?
在我的本地机器上工作的配置文件:
server {
listen 80;
server_name devshop.dev;
index index.php;
root /home/myself/dev/developer-shop/www/;
location ~ ^/api(/|$) {
try_files $uri $uri/ /api/index.php;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
}
location ~ \.php(/|$) {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
}
}
在您的本地计算机上 PHP 脚本在它们各自的位置块中处理。在您的目标机器上,/api/
位置执行内部重写,然后 预期 由 php 块处理。
正则表达式位置块已排序,因此 /api/index.php
不断命中 /api/
位置块 - 因此出现重定向循环。
要么反转正则表达式位置块的顺序,要么更简单地使用带重写的前缀位置块:
location /api {
rewrite ^ /api/index.php;
}
详情见this document。
我正在努力尝试让以下设置在我的机器和 Heroku 上运行:
- 主要页面是 PHP 位于文档根目录中的文件
root/api
下面有一个 API。所有对/api/*
的请求都应转发到其网关文件 (api/index.php
)。
我在本地使用了不同的 conf 文件(如下),但在 Heroku 上没有任何工作正常。我能想到的最好的是:
location / {
try_files $uri $uri/ /index.php?$query_string;
index index.php;
}
location ~ ^/api/(.+) {
try_files /api/index.php /api/index.php;
}
location ~ \.php(/|$) {
try_files @heroku-fcgi @heroku-fcgi;
}
如果我尝试使用重写,它会抱怨无限循环。如果我尝试将网关脚本设置为 index
并使用 try_files
及其 FCGI 位置,我会得到 404 - 因为除了该脚本之外 /api
文件夹下没有任何内容。
使用 try_files
并直接指向脚本使 Heroku 直接发送 .php 文件进行下载而不是解释它。我怎样才能让它被解释,并且仍然覆盖所有其他 /api/*
请求?
在我的本地机器上工作的配置文件:
server {
listen 80;
server_name devshop.dev;
index index.php;
root /home/myself/dev/developer-shop/www/;
location ~ ^/api(/|$) {
try_files $uri $uri/ /api/index.php;
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
}
location ~ \.php(/|$) {
include /etc/nginx/fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
}
}
在您的本地计算机上 PHP 脚本在它们各自的位置块中处理。在您的目标机器上,/api/
位置执行内部重写,然后 预期 由 php 块处理。
正则表达式位置块已排序,因此 /api/index.php
不断命中 /api/
位置块 - 因此出现重定向循环。
要么反转正则表达式位置块的顺序,要么更简单地使用带重写的前缀位置块:
location /api {
rewrite ^ /api/index.php;
}
详情见this document。