【问题标题】:Nginx: Hide .php extension but take PATH_INFONginx:隐藏 .php 扩展名但使用 PATH_INFO
【发布时间】:2016-05-14 17:10:24
【问题描述】:

使用 Nginx,我想将 .php 文件随意添加到我的文档根目录,让它们在没有扩展名的情况下正常工作。不仅如此,我还希望这些随机的 .php 文件在它们之后也有一个 path_info。

所以,如果我添加一个文件 /path/to/root/apple.php 我希望 www.example.com/apple 以及 www.example.com/apple/123www.example.com/apple/123/somethingwww.example.com/apple/123/something/something 工作。

我希望能够一直添加这样的文件,到处都是,而不必在 Nginx 配置中为每个文件添加显式的位置块。我想继续添加/path/to/root/orange.php/path/to/root/quince.php 以及其他任何内容,并且我希望这些路径能够立即工作,而无需它们的 .php 扩展名,并且具有任意 path_info。

在 Apache 中,我可以使用 Options MultiViews。在 Nginx 中,也许这还不可能,但如果是这样,我只想知道这一点,所以我可以停止尝试弄清楚。

【问题讨论】:

    标签: nginx


    【解决方案1】:

    一种常见的模式是查找静态文件,如果找不到,则执行一些默认操作。该默认操作可能是提取 URI 的第一个元素并将其转换为 .php。我做了一个假设,那就是www.example.com/apple/123/something/something,PHP 文件始终是路径的第一个元素,在本例中为 apple.php

    root /path/to/root;
    
    location / {
        try_files $uri $uri/ @php;
    }
    
    location ~ \.php$ {
        try_files $uri =404;
        ...
    }
    
    location @php {
        rewrite ^/([^/]+)(/|$) /$1.php last;
    }
    

    我还没有解决路径信息问题。 PHP 脚本可以通过多种方式访问​​路径信息。有些人会查看原始的 REQUEST_URI,在这种情况下,您只需执行上述操作即可。

    【讨论】:

    • 谢谢。是的,我在想类似的事情。当我做 path_info 时,我几乎总是让它只有一段长。像 /widgets(.php)/123,而不是 /widgets(.php)/something/123。如果我需要,我会做 /widgets/something(.php)/123。文件夹和文件名大致对应于数据库模式,而 path_info 大致是特定行的查找键。所以也许是一个 Location 块来尝试 $uri.php 和另一个带有重写表达式来尝试 /path/to/some.php/with_one_segment_of_path_info。
    • 显然重写可以将.php放在最后一个/之前,但这意味着www.example.com/apple成为一个特例。
    猜你喜欢
    • 2016-12-16
    • 2012-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 2013-03-13
    • 2021-01-23
    相关资源
    最近更新 更多