代理后面的 Nginx 位置重写不起作用

代理后面的 Nginx 位置重写不起作用

我正在创建一个简单的 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

这个文件第一的。

相关内容