如果是邪恶的 - Nginx

问题描述 投票:0回答:3

我使用的是 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;
}
nginx configuration
3个回答
4
投票

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

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
的链接,您就不需要删除它。


2
投票

官方wiki介绍中说有一些情况是可以的。看看这句话:

唯一 100% 安全的事情可以在室内进行(如果在现场) 上下文是:

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

在介绍的最后有一个示例,其中也包含重写命令。所以你的代码看起来也不错。

编辑:您还应该看看 if 是如何工作的


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 在到达匹配位置块之前会自动处理这个问题

© www.soinside.com 2019 - 2024. All rights reserved.