Nginx + PHP-FPM 重定向到静态 PHP 文件
Nginx + PHP-FPM redirect to static PHP file
首先是关于我的设置的一些细节:
- 我正在从默认的 Nginx webroot
提供静态 webapp (HTML + JS)
- 我在 localhost:9000
上有一个 PHP-FPM 服务器 运行
- 对于 FPM,目标文件应该是 /api/webroot/index.php(总是,不需要 try_files 等)
- 我需要转发所有 /api 和 /api-debug 调用以到达 localhost:9000,/app/webroot/index。php 应该处理所有这些请求。
我有以下工作 Nginx 配置:
upstream fastcgi_backend {
server localhost:9000;
keepalive 30;
}
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
location ~ ^/(api|api-debug)/ {
root /app/webroot;
index index.php;
try_files $uri /api/index.php$is_args$args;
location ~ \.php$ {
fastcgi_pass fastcgi_backend;
fastcgi_split_path_info ^(?:\/api\/)(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /app/webroot/$fastcgi_script_name;
include fastcgi_params;
}
}
}
}
我只是想让它更简单、更高效,因为在我看来它现在一团糟。
我尝试调整例如
try_files $uri /api/index.php$is_args$args;
到
try_files $uri /api/webroot/index.php$is_args$args;
它失败了...它起作用的唯一原因是 /api/index.php 包括 /api/webroot/index.php,但我发现它效率低下。
我发现很难调试 nginx 配置,因为它不容易测试。
非常感谢您的提前帮助!
最简单的解决方案是将 SCRIPT_FILENAME 的值硬连接为 /app/webroot/index.php
并完全删除其中一个 location
块。
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~ ^/(api|api-debug)/ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot/index.php;
fastcgi_pass fastcgi_backend;
}
或者,为了保持指定带有 .php
扩展名的 URI 的灵活性,您可以使用以下方法简化配置:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
rewrite ^/(api|api-debug)/ /index.php last;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot$uri;
fastcgi_pass fastcgi_backend;
}
首先是关于我的设置的一些细节:
- 我正在从默认的 Nginx webroot 提供静态 webapp (HTML + JS)
- 我在 localhost:9000 上有一个 PHP-FPM 服务器 运行
- 对于 FPM,目标文件应该是 /api/webroot/index.php(总是,不需要 try_files 等)
- 我需要转发所有 /api 和 /api-debug 调用以到达 localhost:9000,/app/webroot/index。php 应该处理所有这些请求。
我有以下工作 Nginx 配置:
upstream fastcgi_backend {
server localhost:9000;
keepalive 30;
}
server {
listen 80;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
location ~ ^/(api|api-debug)/ {
root /app/webroot;
index index.php;
try_files $uri /api/index.php$is_args$args;
location ~ \.php$ {
fastcgi_pass fastcgi_backend;
fastcgi_split_path_info ^(?:\/api\/)(.+\.php)(.*)$;
fastcgi_param SCRIPT_FILENAME /app/webroot/$fastcgi_script_name;
include fastcgi_params;
}
}
}
}
我只是想让它更简单、更高效,因为在我看来它现在一团糟。 我尝试调整例如
try_files $uri /api/index.php$is_args$args;
到
try_files $uri /api/webroot/index.php$is_args$args;
它失败了...它起作用的唯一原因是 /api/index.php 包括 /api/webroot/index.php,但我发现它效率低下。
我发现很难调试 nginx 配置,因为它不容易测试。
非常感谢您的提前帮助!
最简单的解决方案是将 SCRIPT_FILENAME 的值硬连接为 /app/webroot/index.php
并完全删除其中一个 location
块。
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location ~ ^/(api|api-debug)/ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot/index.php;
fastcgi_pass fastcgi_backend;
}
或者,为了保持指定带有 .php
扩展名的 URI 的灵活性,您可以使用以下方法简化配置:
location / {
root /usr/share/nginx/html;
index index.html index.htm;
rewrite ^/(api|api-debug)/ /index.php last;
}
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /app/webroot$uri;
fastcgi_pass fastcgi_backend;
}