我使用的是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;
}
答案 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会在它到达匹配位置块之前自动处理它