繁体   English   中英

Nginx对PHP的重写规则,该规则还允许URI中包含.php

[英]Nginx rewrite rule to PHP that also allows .php in the URI

有点不寻常的问题,希望有一个简单的答案! (我是Nginx的新手)

我有一个在Apache上运行的旧PHP系统,我想将其带到Nginx,但是我的问题是, 其中一些需要重写回单个处理程序文件( /handler.php ),而某些则需要执行实际文件。 棘手的部分似乎是,几乎所有路由都以.php结尾,无论它们是否引用实际的PHP文件。

例如,/ foo.php可能是执行其自身代码的实际文件,但是/bar.php可能不存在,因此希望调用/handler.php 还有一些形式为/ bar (不带.php扩展名)的路由实例,它们也想调用/handler.php

系统中有很多所有类型(远远超出我想要手动编写的代码)。 Nginx对此有解决方案吗?

服务器块当前包含以下内容:

location / {
    try_files $uri $uri/ /handler.php$is_args$args;
}

include /etc/nginx/sites.d/*.conf;

和sites.d / php.conf当前看起来像:

location ~ \.php$
{
    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include         /etc/nginx/fastcgi_params;
}

但是,这会将所有带有.php扩展名的路由都视为实际文件,并为我提供了标准的“未指定输入文件”。 不存在的错误(不执行重写)。 如果没有.php扩展名,他们会毫无问题地调用/handler.php。

因此,总而言之,使用这种几乎默认的设置:

/foo.php - works (actual file)
/bar.php - fails (no file)
/bar     - works (no file)

如果我只有“ no-file”类型,则可以将php.conf更新为“ location〜\\ handler.php $” ,但是在这种情况下,这意味着所有实际的.php文件都只会触发下载(即/ foo .php失败)。

任何帮助表示赞赏! 提前致谢。

在与.php匹配的位置块中,您可以测试文件是否确实存在,如果不存在,则重定向到handler.php

location ~ \.php$ {
    if (!-f $request_filename) {
        rewrite ^.*\.php$ /handler.php last;
    }

    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include         /etc/nginx/fastcgi_params;
}

更新的例子

使用try_files的替代位置规则(由OP建议):

location ~ \.php$ {
    try_files $uri /handler.php$is_args$args;

    fastcgi_pass    unix:/var/run/php5-fpm.sock;
    fastcgi_index   index.php;
    fastcgi_param   SCRIPT_FILENAME  $document_root$fastcgi_script_name;

    include         /etc/nginx/fastcgi_params;
}

对于使用重写的第一个版本,您可以从正则表达式匹配项中进行替换。 但是我认为try_file是测试文件存在性的推荐方法。 感谢OP建议改进的方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM