AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 868291
Accepted
Andrew Newby
Andrew Newby
Asked: 2017-08-13 00:07:52 +0800 CST2017-08-13 00:07:52 +0800 CST 2017-08-13 00:07:52 +0800 CST

Nginx 重写的多个条件

  • 772

我正在尝试找到重写此规则的最佳方法,以便它可以在 nginx 上运行:

   RewriteCond %{REQUEST_URI} !^/clip-art/.*$
   RewriteCond %{REQUEST_URI} !^/Clip-Art/.*$
   RewriteCond %{REQUEST_URI} !^/cgi-bin/.*$
   RewriteCond %{REQUEST_URI} !^/images/.*$
   RewriteCond %{REQUEST_URI} !/invitation/
   RewriteCond %{REQUEST_URI} !/designer/
   RewriteRule ^/(.*)/(.*)/(.*)/(.*)$ /clip-art/$1/$2/$3/$4 [r=301,nc,l]

我知道我可以做类似的事情:

   if ($request_uri !~ "/designer") {
       rewrite ^/(.*)/(.*)/(.*)/(.*)$ /clip-art/$1/$2/$3/$4 permanent;
   }

但显然这只适用于其中一个文件夹名称。如何使它与多个文件夹名称一起使用?

nginx
  • 2 2 个回答
  • 3603 Views

2 个回答

  • Voted
  1. Best Answer
    Zenexer
    2017-08-13T01:00:02+08:002017-08-13T01:00:02+08:00

    当其他方法足够时,正则表达式的效率相对较低,并且通常不鼓励在 Nginx 配置中使用。这里有一些不需要正则表达式的情况:

    location /clip-art/ {
        # ...
    }
    
    location /Clip-Art/ {
        # ...
    }
    
    location /images/ {
        # ...
    }
    
    location /cgi-bin/ {
        # ...
    }
    

    如果您只是从其中至少三个中提供静态图像,我们可以让它变得更简单。前缀意味着这些^~规则将优先于基于正则表达式的规则,否则将优先。虽然这有很多用途,但在处理仅包含静态资源的目录时,它可以作为一种安全功能。如果有人设法上传 PHP 文件或其他通常由正则表达式位置处理的可执行代码,则预正则表达式位置(带有^~)将获胜,并且该文件将不会被执行。我也省略了典型$uri/的,因为它并不真正适用于静态资源目录。

    location ^~ /clip-art/ { try_files $uri =404; }
    location ^~ /Clip-Art/ { try_files $uri =404; }
    location ^~ /images/   { try_files $uri =404; }
    
    location /cgi-bin/ {
        # ...
    }
    

    至于其余的条件,Nginx 设计为从每个 URI 的开头开始匹配。理想情况下,您可以在应用程序中处理这些类型的场景,而不是在 Nginx 中。但是,在这种特定情况下,可以编写一个相对有效的正则表达式:

    rewrite "^((?:/(?!designer|invitation)[^/]+){4})/?$" /clip-art$1 permanent;
    
    • 3
  2. Tero Kilkanen
    2017-08-13T00:46:22+08:002017-08-13T00:46:22+08:00

    https://stackoverflow.com/questions/406230/regular-expression-to-match-a-line-that-doesnt-contain-a-word包含如何使用正则表达式查找不包含某些单词的字符串的示例。

    在您的指令中使用此正则表达式方法location,然后在块rewrite内使用您的语句。location

    此外,我建议您在指令中使用.+(一个或多个匹配项)而不是.*(零个或多个匹配项)作为您的通配符。rewrite

    • 2

相关问题

  • Gzip 与反向代理缓存

  • nginx 作为代理的行为

  • Nginx 学习资源 [关闭]

  • 提供 70,000 个静态文件 (jpg) 的最佳方式?

  • 在 Apache、LightTPD 和 Nginx Web 服务器上提供 PHP 5.x 应用程序的现状?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve