0

现在我的 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 子句,但仍然没有运气。

4

3 回答 3

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;
}

这将有效地解析给定 server{} 块对 parse.php 的每个请求。

现在您可以通过 $_SERVER['REQUEST_URI']; 确定原始请求。在您的 parse.php 脚本中,然后从那里做任何您想做的事情。

于 2013-04-16T21:33:51.037 回答
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;
}
于 2013-04-17T02:11:31.120 回答
0

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

location / {
    try_files $uri /parse.php$request_uri;
    include fastcgi_params;
    fastcgi_pass 127.0.0.1:9000;
}
于 2013-05-17T02:51:00.587 回答