NGINX将路径作为变量发送给PHP,除非路径是文件路径

时间:2018-04-12 05:00:02

标签: php regex nginx

我想将所有路径传递给index.php?page = path。例如:

domain.com/a/b/c -> index.php?page=a/b/c

因此,这是我的NGINX配置文件:

location ~ /(?P<arg1>.*)$ {
    fastcgi_pass php:9000;
    fastcgi_param  QUERY_STRING       /index.php?page=$arg1;
}

据我所知,查询字符串应该是.com后的所有内容,对吧?我把arg1传给了它。但是,我想忽略真正的文件路径,例如/file.jpg/images/favicon.ico。我可以简单地在正则表达式中否定它们但是它们根本就没有路径。

那么如何将/anythingindex.php?page=anything匹配,除了文件并实际提供这些文件?

4 个答案:

答案 0 :(得分:2)

您需要使用以下

location ~ /(.*)$ {
  try_files $uri $uri/ /index.php?page=$1;
}

首先检查文件或目录是否存在,然后将其传递给index.php文件

答案 1 :(得分:1)

根据您的Apache的.htaccess,Nginx下的等效设置为:

    location / {
        # First attempt to serve request as file, then
        # as directory, then index.php?page=$args.
        try_files $uri $uri/ /index.php?page=$args;
    }

答案 2 :(得分:1)

我不知道nginx,但假设真正/真实的路径以某种扩展结束,并且您可以编写具有更高优先级的顶级规则的若干规则,您可以编写以下规则:

第一条规则匹配以扩展名结尾的网址:(点+字)并且不执行任何操作:

/^.*[.]\w+$/

第二条规则匹配任何内容并捕获:

/(.*)/

如果无法做到这一点,您可以尝试使用与以下网址匹配的规则:foo / bar / foo / bar /...

(\w+(?:\/\w+)*\/?)

如果您不想允许上一个/小节,请使用

(\w+(?:\/\w+)*)

答案 3 :(得分:0)

您提到的用例非常常见,详情请参阅 Front Controller Pattern Web Apps

部分下的the common Nginx pitfalls page

根据上述页面,对于Drupal,Joomla等,只需在您的位置块中使用它:

try_files $uri $uri/ /index.php?q=$uri&$args;

由于您要使用“页面”变量名称,因此您的代码将如下所示:

location / {
    try_files $uri $uri/ /index.php?page=$uri&args;
}

部分$uri/仅在您要从目录提供内容时才相关,例如,如果您要从yourdomain.com/blog/提供Wordpress博客。如果不是这种情况,您可以删除$uri/部分。

我的建议是不要使用page作为变量将部分/路由传递给PHP,因为您可能最终会在要显示的网站的哪个部分之间产生混淆 vs 。哪个页码 Page 会产生误导,我会改用 route

当然,您的里程可能会有所不同,您可能需要根据您的需求更复杂的东西,但对于基本网站,这些将完美地运作。你应该始终从简单开始,然后从那里开始构建。

此外,为了使调试更容易,请考虑使用详细error log setting,我使用infonotice来调试路由:

error_log logs/error.log info;

祝你好运,并告诉我们你是如何解决这个问题的。