【问题标题】:If Is Evil - Nginx如果是邪恶的 - Nginx
【发布时间】:2015-01-22 09:45:20
【问题描述】:

我使用的是 Nginx 1.6.2。我读到 if () 是邪恶的,使用它不好,所以我需要一些帮助,因为如果不使用 if(),我将无法做我想做的事。我将发布我与 if 的规则,并会询问是否有人可以帮助我并告诉我如何不使用 if () 并使用其他东西并获得相同的结果。

# REDIRECT NON-WWW TO WWW.
if ($http_host != "www.site.eu") {
    rewrite ^ http://www.site.eu$request_uri permanent;
}

# REMOVE INDEX FILES FROM URL FOR SEO PURPOSE.
if ($request_uri ~ "/index.php") {
    rewrite ^ /$1 permanent;
}

# REMOVE ANY MULTIPLE SLASHES IN THE URL.
if ($request_uri ~* "\/\/") {
    rewrite ^/(.*) $scheme://$host/$1 permanent;
}

【问题讨论】:

  • 第一个块应该被单独的服务器块替换。 99% 的情况下不需要第二个和第三个
  • @Alexey 十 - 你是什么意思,哪个第一个块应该被单独的服务器块替换,你所说的单独的服务器块是什么意思,服务器 {}?由于我不明白您的意思,是否可以给我正确的规则?
  • 您的第一条规则应按照 Alexey Ten 的建议进行处理。第二条规则有点无意义,如果真的需要,需要在 Alexey 的“正常配置”服务器块下进行重组。第三条规则由 nginx 自动处理,根本不需要。

标签: nginx configuration


【解决方案1】:

第一条规则应该用单独的服务器块替换

server {
    listen 80 default_server;
    return 301 http://www.example.com$request_uri;
}

server {
    listen 80;
    server_name www.example.com;

    # normal config
}

通常不需要其他ifs。只是不要使用index.php 生成链接,您就不需要剥离它。

【讨论】:

    【解决方案2】:

    In the official wiki introduction 它说有些情况是可以的。看看这句话:

    唯一可以在室内完成的 100% 安全的事情 上下文是:

    返回 ...;重写...最后;

    在介绍的最后有一个例子,它也有一个重写命令。所以你的代码看起来也不错。

    编辑:您还应该看看how the if works。

    【讨论】:

      【解决方案3】:

      你可以替换这个块

      # REMOVE INDEX FILES FROM URL FOR SEO PURPOSE.
      if ($request_uri ~ "/index.php") {
          rewrite ^ /$1 permanent;
      }
      

      有了这个

      location ~ ^/index.php/(.*[^/])$ { return 301 $scheme://$host/$1/$is_args$args; }
      location ~ ^/index.php/(.*)/$ { return 301 $scheme://$host/$1/$is_args$args; }
      

      我也不认为你需要担心 double // 的最后一条规则,因为默认情况下 nginx 会在匹配位置块之前自动处理它

      【讨论】:

      • 谢谢你,最后一条规则是必需的,因为如果它不存在,双 // 仍然会出现。由于某种原因,nginx不会像你说的那样自动删除它。
      猜你喜欢
      • 2011-01-02
      • 2011-04-28
      • 1970-01-01
      • 2010-09-16
      • 2014-03-28
      • 2011-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多