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

时间:2013-04-15 16:29:33

标签: url-rewriting nginx 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子句但仍然没有运气。

3 个答案:

答案 0 :(得分:0)

好吧,如果有人想知道,这是解决方案,只需将两个位置块合并在一起然后添加中断;重写强制一切都去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脚本中,从那里做任何你想做的事。

答案 1 :(得分:0)

实际上您不需要重写规则,因为每个请求都会发送到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;
}

答案 2 :(得分:0)

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

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