如何重定向所有请求,甚至index.php转到另一个php文件(parse.php)


How to redirect ALL requests, even index.php to go to another php file (parse.php)

现在我在我的nginx配置:

location / {
     rewrite ^(.*)$ /parse.php;
}

再往下:

location ~'.php$ {
            root /var/www/site.com/public/;
            fastcgi_split_path_info ^(.+'.php)(/.+)$;
            include fastcgi_params;
            fastcgi_pass 127.0.0.1:9000;
    }
如果我浏览到

site.com/example/this

它按照它应该做的去parse.php ($_SERVER['REQUEST_URI']被正确设置为'/example/this')。对于site.com/images/test.jpg也是如此,它将按预期工作并将其传递给parse.php脚本。

然而,如果我要'site.com/another.php',它不会去解析,而是说:

没有指定输入文件。

你知道怎么让它工作吗?我删除了try_files子句,但仍然没有成功。

好吧,如果有人想知道,这是解决方案,简单地合并两个位置块在一起,然后添加break;到重写迫使所有内容都转到PHP脚本。

由于某些原因,当两个块分开时,第一个位置(指定所有内容都应重写为parse.php)被第二个位置(仅针对php文件)覆盖,并以某种方式将请求还原回原始php文件,而不是根据重写的parse.php。

location / {
    rewrite ^(.*)$ /parse.php break;
    root /var/www/site.com/public/;
    fastcgi_split_path_info ^(.+'.php)(/.+)$;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
}

这将有效地解析每个请求到你的parse.php为给定的服务器{}块。

现在你可以通过$_SERVER['REQUEST_URI'];在parse.php脚本中,从那里开始做任何你想做的事情

实际上您不需要重写规则,因为每个请求都被发送到parse.php。正则表达式很慢。你也可以试试这个:

location / {
    root /var/www/site.com/public;
    include fastcgi_params;
    fastcgi_param  SCRIPT_FILENAME  $document_root/parse.php;
    fastcgi_param  SCRIPT_NAME  parse.php;
    fastcgi_pass 127.0.0.1:9000;
}

$uri仅用于资产支持,如果找到图像和静态文件,则直接提供而不传递给parse.php,否则将传递给parse.php

location / {
    try_files $uri /parse.php$request_uri;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
}