我在下面给出了/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
- 返回hello World bonjour.php
- 返回bonjour 现在问题在于:
如果我浏览https://example.com/rproxy
,它会立即返回 hello world - 预期结果。
但是,如果我浏览https://example.com/rproxy/bonjour.php
(甚至是https://example.com/rproxy/index.php
),我会获得404 error
。
我明白这里发生了什么。我的Nginx配置导致Nginx的example.com实例尝试在本地(即在*.php
)上找到所有example.com
文件,当我正在寻找的文件实际上在example.org:8144
时,该文件失败
我想有一种相对简单的方法告诉Nginx
何时不尝试执行PHP
文件 - 当它实际上在rproxy上时。但是,我对Nginx
混淆的了解太有限了,我无法弄清楚如何改变配置。对于可能告诉我如何更改配置以防止这种情况发生的任何人,我都非常感激。
我应该在这里澄清一下:
我需要能够在两个服务器 example.com
和example.org
上运行PHP脚本。
这里有一个非常简单的解决方法 - 我使用不同的扩展名,例如php5,用于代理服务器上的php脚本,example.org。但是,这很容易导致不可预见的问题。
答案 0 :(得分:7)
对于nginx regexp,位置的优先级高于前缀位置。但
如果最长的匹配前缀位置具有“^〜”修饰符 不检查正则表达式。
所以尝试替换
location /rproxy/ {
与
location ^~ /rproxy/ {
答案 1 :(得分:0)
您传递的上游服务器不知道您的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;
}