nginx 重写:除了空的基本 url 之外的所有内容
Posted
技术标签:
【中文标题】nginx 重写:除了空的基本 url 之外的所有内容【英文标题】:nginx rewrite: everything but empty base url 【发布时间】:2013-09-08 11:13:57 【问题描述】:经过大约 2 小时的谷歌搜索并尝试了各种方法后,我向您寻求帮助。
任务: 在 nginx 中将空白 url 重写为某些内容,并将其他所有内容重写为不同的内容。
所以,如果我导航到 subdomain.somedomain.tld,我想获得 index.php,如果我转到 subdomain.somedomain.tld/BlAaA,我会被重定向到 index.php?url=BlAaA。例外情况是 /img、/include 下的文件和 index.php 本身。它们不会被重写。
第二部分已经生效,白名单也是如此,但我无法弄清楚或找到完成整个想法的东西。
工作部分:
server
listen 80;
server_name subdomain.domain.tld;
location /
include php.conf;
root /srv/http/somefolder/someotherfolder/;
if ( $uri !~ ^/(index\.php|include|img) )
rewrite /(.*) /index.php?url=$1 last;
index index.php;
@pablo-b 提供的答案几乎解决了我的问题。 这种方法只存在两个问题: 1:PHP-FPM 现在需要在 /etc/php/php-fpm.conf 中设置 /include/ 下文件的扩展名(例如 style.css、background.jpg) .limit_extensions。我原来的 php.conf 的工作方式是
location ~ \.php
#DO STUFF
哪个 nginx 不喜欢,因为它有点覆盖了您建议中的 location /index.php 部分。不过,只要有足够的时间,我可以解决这个问题。
2:$request_uri 产生“/whatever”,而不是“whatever”作为我的 url= 参数的值。当然,我可以在我的 php 代码中解析“/”,但我的原始解决方案没有添加前导“/”。有什么优雅的方法可以解决这个问题?
【问题讨论】:
我添加了删除/
部分,虽然它看起来不是很优雅(性能方面,映射仅在$uri_without_slash
被访问时发生)。至于 1),您可以将 location = /index.php
替换为 location ~ \.php
,但它不会重定向任何包含字符串 .php
的 url。
【参考方案1】:
我建议避免使用if
,并利用与使用的模式匹配方法相关的优先级处理不同的位置 (docs):
#blank url
location = /
return 302 http://subdomain.domain.tld/index.php;
#just /index.php
location = /index.php
include common_settings;
#anything starting with /img/
location ^~ /img/
include common_settings;
#anything starting with /include/
location ^~ /include/
include common_settings;
#everything else
location /
return 302 http://subdomain.domain.tld/index.php?url=$uri_without_slash;
在一个名为common_settings
的单独配置文件中:
include php.conf;
root /srv/http/somefolder/someotherfolder/;
index index.php;
编辑:添加删除 url 中的第一个斜杠:
在您的 conf 中,在任何 server
指令之外:
map $request_uri $uri_without_slash
~^/(?P<trailing_uri>.*)$ $trailing_uri;
【讨论】:
谢谢!效果很好!就像其他有这个问题的人的参考一样:如果我刚刚在我的页面本身中检查了 $_GET['url'] == '' ,它可以通过我原来的方式解决。但是这个解决方案更干净。以上是关于nginx 重写:除了空的基本 url 之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章