我想将所有路径传递给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
。我可以简单地在正则表达式中否定它们但是它们根本就没有路径。
那么如何将/anything
与index.php?page=anything
匹配,除了文件并实际提供这些文件?
答案 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,我使用info
或notice
来调试路由:
error_log logs/error.log info;
祝你好运,并告诉我们你是如何解决这个问题的。