Nginx - PHP 脚本未从反向代理调用
Nginx - PHP scripts not being called from reverse proxy
我在下面摘录了 /etc/nginx/sites-available/default
文件
server {
listen 443 ssl;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ = 404;
}
location /rproxy/ {
proxy_pass https://example.org:8144/;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
....
}
example.org:8144
服务器
有文件和
index.php
- returns 你好世界
bonjour.php
- returns你好
问题来了:
如果我浏览到 https://example.com/rproxy
它会立即 returns hello world - 预期的结果。
但是,如果我浏览到 https://example.com/rproxy/bonjour.php
(甚至 https://example.com/rproxy/index.php
),我会得到一个 404 error
。
我明白这里发生了什么。我的 Nginx 配置导致 Nginx 的 example.com 实例尝试在本地(即在 example.com
上)查找所有 *.php
文件,当我正在寻找的文件实际上在 [=13] 上时失败=].
我想有一种相对简单的方法可以告诉 Nginx
什么时候不要尝试执行 PHP
文件——当它实际上在 rproxy 上时。但是,我对 Nginx
配置的了解太有限,无法弄清楚如何更改配置。如果有人能告诉我如何更改配置以防止这种情况发生,我将非常感激。
我应该在这里澄清一些事情:
我需要能够在两个服务器 example.com
和example.org
上运行 PHP 脚本。
这里有一个非常简单的解决方法 - 我使用不同的扩展名,比如 php5,用于代理服务器 example.org 上的 php 脚本。但是,这很容易导致不可预见的问题。
对于 nginx,正则表达式位置比前缀位置具有更高的优先级。但是
If the longest matching prefix location has the “^~” modifier then
regular expressions are not checked.
所以尝试替换
location /rproxy/ {
与
location ^~ /rproxy/ {
您传递的上游服务器不知道您的 nginx 配置。同样,您的 nginx 不知道您的上游应该如何响应请求。他们谁都不会关心对方的配置。
这是实际传递脚本名称的开始,但是有很多不同的方法可以做到这一点,它们都完全取决于上游的配置方式。另外,如果可以避免,不要使用正则表达式;无缘无故地放慢速度是没有意义的。
upstream reverse {
server example.org:8144;
}
server {
listen 443 ssl;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location /rproxy {
proxy_pass https://reverse/$request_uri;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass /blah/tmp.sock;
}
}
(不一定聪明)但巧妙的方法是当你定义你的 PHP 块回退到你的上游而不是 =404
(同样,这是一个糟糕的主意,除非你知道什么你正在做,但它可以完成):
location @proxy {
proxy_pass https://upstream$request_uri;
}
location ~ \.php$ {
try_files $uri @proxy;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass /blah/tmp.sock;
}
我在下面摘录了 /etc/nginx/sites-available/default
文件
server {
listen 443 ssl;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ = 404;
}
location /rproxy/ {
proxy_pass https://example.org:8144/;
}
location ~ \.php$ {
try_files $uri = 404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
....
}
example.org:8144
服务器
有文件和
index.php
- returns 你好世界bonjour.php
- returns你好
问题来了:
如果我浏览到 https://example.com/rproxy
它会立即 returns hello world - 预期的结果。
但是,如果我浏览到 https://example.com/rproxy/bonjour.php
(甚至 https://example.com/rproxy/index.php
),我会得到一个 404 error
。
我明白这里发生了什么。我的 Nginx 配置导致 Nginx 的 example.com 实例尝试在本地(即在 example.com
上)查找所有 *.php
文件,当我正在寻找的文件实际上在 [=13] 上时失败=].
我想有一种相对简单的方法可以告诉 Nginx
什么时候不要尝试执行 PHP
文件——当它实际上在 rproxy 上时。但是,我对 Nginx
配置的了解太有限,无法弄清楚如何更改配置。如果有人能告诉我如何更改配置以防止这种情况发生,我将非常感激。
我应该在这里澄清一些事情:
我需要能够在两个服务器 example.com
和example.org
上运行 PHP 脚本。
这里有一个非常简单的解决方法 - 我使用不同的扩展名,比如 php5,用于代理服务器 example.org 上的 php 脚本。但是,这很容易导致不可预见的问题。
对于 nginx,正则表达式位置比前缀位置具有更高的优先级。但是
If the longest matching prefix location has the “^~” modifier then regular expressions are not checked.
所以尝试替换
location /rproxy/ {
与
location ^~ /rproxy/ {
您传递的上游服务器不知道您的 nginx 配置。同样,您的 nginx 不知道您的上游应该如何响应请求。他们谁都不会关心对方的配置。
这是实际传递脚本名称的开始,但是有很多不同的方法可以做到这一点,它们都完全取决于上游的配置方式。另外,如果可以避免,不要使用正则表达式;无缘无故地放慢速度是没有意义的。
upstream reverse {
server example.org:8144;
}
server {
listen 443 ssl;
server_name example.com;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ =404;
}
location /rproxy {
proxy_pass https://reverse/$request_uri;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass /blah/tmp.sock;
}
}
(不一定聪明)但巧妙的方法是当你定义你的 PHP 块回退到你的上游而不是 =404
(同样,这是一个糟糕的主意,除非你知道什么你正在做,但它可以完成):
location @proxy {
proxy_pass https://upstream$request_uri;
}
location ~ \.php$ {
try_files $uri @proxy;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
include fastcgi_params;
fastcgi_pass /blah/tmp.sock;
}