我正在创建一个简单的 nginx Web 服务器。有几个 php 文件和一些静态页面,我将它们分成不同的文件夹,php 文件在 /data/webjp 中,html 文件在 /data/webjp_static 中。以下是配置文件:
server
{
listen 80;
location / {
proxy_pass http://127.0.0.1:7900/;
proxy_store on;
proxy_set_header Host $host;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
server
{
listen 7900;
server_name 127.0.0.1;
root /data/webjp/weber;
index index.html index.php;
location ~ .*\.(php|php5)?$
{
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME /data/webjp/weber/index.php;
}
location ~ /erarticles/ {
root /data/webjp_static;
}
if (-f $request_filename) {
break;
}
location ~* \.html$ {
expires -1;
}
}
似乎“location ~ /erarticles/”块不起作用。当我尝试访问http://192.168.1.118/erarticles/56b1be02e33f6e3c6f000000/2016001.html,我得到了 404。
但是,如果我将“location ~ /erarticles/”块放入代理服务器块中,它确实有效。为什么?
看了 Richard Smith 的回答后,我找到了一个线索,其实我的项目是使用 Yii 框架的,发到这里的时候省略了几行配置文件。
if (!-f $request_filename) {
rewrite ^/(.+)$ /index.php?url=$1 last;
break;
}
答案1
该问题与反向代理无关。7900 的服务器块存在多个问题。
默认文档根目录设置为 PHP 目录,因此该location ~* \.html$
阻止永远不起作用。
我不知道该怎么if (-f $request_filename) { break; }
办。
并且该location ~ .*\.(php|php5)?$
块匹配如下的 URI .
。您声明您有一些.php
文件,但您只返回index.php
。
您是否考虑过使用try_files
?例如(这只是一个起点):
server {
listen 7900;
root /data/webjp_static;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
location ~ \.php5?$ {
root /data/webjp/weber;
try_files $uri =404;
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $request_filename;
}
location ~* \.html$ {
expires -1;
}
}
请注意,该index
指令将找不到任何index.php
文件,因为您将它们保存在与文件分开的目录中.html
。
读这个文件第一的。