nginx重定向除一个目录外的所有目录

brqmpdu1  于 2023-10-17  发布在  Nginx
关注(0)|答案(2)|浏览(139)

我正在使用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看起来优先级将是正则表达式的第一个,并且第一个匹配查询的正则表达式将停止搜索。
谢谢

g6ll5ycj

g6ll5ycj1#

location / {
    rewrite ^/(.*)$ http://www.google.com/search?q=$1 permanent;
}

location /blog {
      root   html;
      index index.php;
      try_files $uri $uri/ /blog/index.php;
}

说明
location后面可以跟一个路径字符串(称为prefix string)或regex

正则表达式以**~开头(区分大小写匹配)或以~* 开头(不区分大小写匹配)。
以**^~开头的前缀字符串会使nginx忽略任何潜在的正则表达式匹配(下面有更多关于它的信息)。
nginx使用以下规则来确定使用哪个
位置**(所有匹配都是针对规范化的URI完成的。更多详情见[1]):
1.Regex匹配URI(除非有匹配URI的前缀字符串,并且该前缀字符串以**^~**开头)。如果有多个正则表达式匹配,nginx使用conf文件中列出的第一个匹配。
1.最长前缀字符串
这里有几个例子(从[1]获得):

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}
  • /”请求将匹配配置A
  • /index.html”请求将匹配配置B。请注意,它不匹配配置A,因为A有一个**=**符号(location = /),这强制了精确匹配。
  • /documents/document.html”请求将匹配配置C
  • /images/1.gif”请求将匹配配置D。请注意,前缀字符串有**^~,这指示nginx不要查找潜在的正则表达式匹配(否则该请求将匹配配置E,因为正则表达式优先于前缀字符串)。
    */documents/1.jpg请求将匹配
    配置E**。

有用文档:

soat7uwm

soat7uwm2#

这种情况也可以只使用正则表达式来处理。虽然这是一个非常古老的问题,并且已经被标记为答案,但我正在添加另一个解决方案。
如果您使用反向代理使用多个循环转发,这是最简单的方法,而不必为每个目录添加单独的位置块。

root html;
index index.php;

location / { #Match all dir
      try_files $uri $uri/ $uri/index.php;
}

location ~ /(?!blog|item2)(.*)$ { #Match all dir except those dir items skipped
      rewrite ^/(.*) http://www.google.com/search?q=$1 permanent;
}

相关问题