在nginx中使用rewrite和php-fpm for .php扩展名

时间:2016-05-04 14:31:02

标签: php nginx url-rewriting

我正在尝试从Nginx + PHP-FPM迁移到Apache + mod_php。我目前正在使用mod_rewrite将一些以.php结尾的虚拟URI重写为实际的PHP脚本。这在使用mod_php时非常有效。但是使用Nginx + FPM,因为我们必须使用proxy_pass,所以这不起作用。当我添加正则表达式位置块以匹配.php扩展名时,它会获得最高优先级,并且不会应用我的重写规则。

我该如何解决这个问题?

location /test/ {
    rewrite "^/test/([a-z]+).php$" test.php?q=$1 last; 
}

location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+?\.php)(/.*)$;

    set $fastcgi_script_name_custom $fastcgi_script_name;
    if (!-f $document_root$fastcgi_script_name) {
        set $fastcgi_script_name_custom "/cms/index.php";
    }

    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    include fastcgi_params;
}

1 个答案:

答案 0 :(得分:1)

您可以将rewrite规则放在location块的上下文中server块之上。或者,您可以将rewrite规则放在与{URI匹配的location块中。

所以你可以使用这个:

rewrite "^/test/([a-z]+).php$" /test.php?q=$1 last;

location / { ... }

location ~ [^/]\.php(/|$) { ... }

或者这个:

location / { ... }

location ~ [^/]\.php(/|$) {
    rewrite "^/test/([a-z]+).php$" /test.php?q=$1 break;
    ...
}

请注意,重写的URI需要前导/(与Apache惯例不同)。

有关详细信息,请参阅this document