我正在使用nginx 1.0.8,我试图将所有访问者从www.mysite.com/dir重定向到谷歌搜索页面http://www.google.com/search?q=dir,其中dir是一个变量,但是如果dir==“blog”(www.mysite.com/blog),我只想加载博客内容(Wordpress)。
下面是我的配置:
location / {
root html;
index index.html index.htm index.php;
}
location /blog {
root html;
index index.php;
try_files $uri $uri/ /blog/index.php;
}
location ~ ^/(.*)$ {
root html;
rewrite ^/(.*) http://www.google.com/search?q=$1 permanent;
}
如果我这样做,甚至www.mysite.com/blog将被重定向到谷歌搜索页面。如果我删除最后一个位置www.mysite.com/blog工作得很好。
从我在这里读到的:http://wiki.nginx.org/HttpCoreModule#location看起来优先级将是正则表达式的第一个,并且第一个匹配查询的正则表达式将停止搜索。
谢谢
2条答案
按热度按时间g6ll5ycj1#
说明:
location后面可以跟一个路径字符串(称为prefix string)或regex。
正则表达式以**~开头(区分大小写匹配)或以~* 开头(不区分大小写匹配)。
以**^~开头的前缀字符串会使nginx忽略任何潜在的正则表达式匹配(下面有更多关于它的信息)。
nginx使用以下规则来确定使用哪个位置**(所有匹配都是针对规范化的URI完成的。更多详情见[1]):
1.Regex匹配URI(除非有匹配URI的前缀字符串,并且该前缀字符串以**^~**开头)。如果有多个正则表达式匹配,nginx使用conf文件中列出的第一个匹配。
1.最长前缀字符串。
这里有几个例子(从[1]获得):
location = /
),这强制了精确匹配。*/documents/1.jpg请求将匹配配置E**。
有用文档:
soat7uwm2#
这种情况也可以只使用正则表达式来处理。虽然这是一个非常古老的问题,并且已经被标记为答案,但我正在添加另一个解决方案。
如果您使用反向代理使用多个循环转发,这是最简单的方法,而不必为每个目录添加单独的位置块。