如果是邪恶 - Nginx

时间:2015-01-22 09:45:21

标签: nginx configuration

我使用的是Nginx 1.6.2。我读到如果()是邪恶的并且使用它并不好,所以我需要一些帮助,因为我不能使用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;
}

3 个答案:

答案 0 :(得分:3)

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

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

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

    # normal config
}

其他if通常不是必需的。只是不与index.php生成链接,您无需剥离它。

答案 1 :(得分:1)

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

  

如果在位置,可以在里面完成100%安全的事情   背景是:

     

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

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

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

答案 2 :(得分:1)

您可以替换此块

# 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会在它到达匹配位置块之前自动处理它