【问题标题】:Nginx location "not equal to" regexNginx 位置“不等于”正则表达式
【发布时间】:2013-04-30 14:53:54
【问题描述】:

如何在 Nginx 中设置location 条件以响应不等于所列位置的任何内容?

我试过了:

location !~/(dir1|file2\.php) {
   rewrite ^/(.*) http://example.com/$1 permanent;
}

但它不会触发重定向。它只是使用服务器配置其余部分中的规则处理请求的 URI。

【问题讨论】:

  • 我不明白。例如,用户转到/aabbcc,您要将他重定向到哪里?
  • 这也可以应用于位置指令location ~ ^/(?!(dir1|file2\.php)) {}

标签: regex nginx webserver


【解决方案1】:

根据nginx documentation

没有不匹配正则表达式的语法。相反,匹配目标正则表达式并分配一个空块,然后使用 location / 匹配其他任何内容

所以你可以定义类似的东西

location ~ (dir1|file2\.php) { 
    # empty
}

location / {
    rewrite ^/(.*) http://example.com/$1 permanent; 
}

【讨论】:

  • 值得注意的是:我需要这个来有条件地重定向一个主机名,并且在重定向的旁边还有一些locations。重定向不起作用。原来我必须根据*.com/a/14049884添加一个break;指令
  • 不幸的是,当您想在第一个位置 proxy_pass 请求时,这不起作用,因为 proxy_pass 不支持正则表达式
  • 我知道文档说 there is no syntax for NOT matching 但是 ~ ^/(?!(text or pattern not to match)) 是有效的正则表达式,更重要的是有效。
【解决方案2】:

我也在寻找同样的东西。并找到了这个解决方案。

使用否定正则表达式断言:

location ~ ^/(?!(favicon\.ico|resources|robots\.txt)) { 
.... # your stuff 
} 

来源 Negated Regular Expressions in location

正则表达式的解释:

如果 URL 不匹配以下任何路径

example.com/favicon.ico
example.com/resources
example.com/robots.txt

然后它将进入该位置块并对其进行处理。

【讨论】:

  • 这很好用。示例: location ~ (/konference(?!/20)) catch /konference,/konference/images/ NOT catch /konference/2015, /konferece/2015/images 在 Nginx 1.10.2 上测试
  • 如果需要如何提取变量?我想知道 slug 是什么,所以我可以将它传递给代理通道。
  • @ApoorvNag 我不知道,尝试创建新问题。谢谢
  • 真的很有用。 EG 捕获除索引 location ~ /public/(?!index.php$)+.*\.php$ { rewrite ^/(.*)$ /public/index.php?url=$1; } 之外的任何 php 文件
  • @AMB 你能解释一下正则表达式吗?即使在阅读了源链接后我也没有得到它。