避免 NGINX 双重重定向

避免 NGINX 双重重定向

我正在使用 Nginx 的 301 重定向将我的网站用户重定向到网站的 HTTPS 版本。
我使用 Google 的 PageSpeed 测试了我的网站,发现我从主页进行了双重重定向。这是因为我的 CMS。示例:
http:// domain.tld -> NGINX 301 -> 到 https:// domain.tld -> CMS 重定向 -> https:// domain.tld/homepage

我希望我可以使用 NGINX 重定向直接根链接

location = / {
    return 301 https:// domain.tld/homepage;
}

这对主页有效,但是,这会给主页以外的任何其他 http 页面带来 404 错误,我尝试return 301 https://$host$request_uri;在位置块下添加,但不知何故这会覆盖根域规则。(这再次产生双重重定向)有没有办法将所有链接重定向到其适当的 request_uri,除了根域?

PS 我希望不使用if函数来做到这一点:参见:https://www.nginx.com/resources/wiki/start/topics/depth/ifisevil/



这是我的完整配置文件的示例:

server {
    listen       80;
    server_name  domainname.tld;

    location = / {
        return 301 https://domainname.tld/homepage;
    }

    return 301 https://$host$request_uri; 
    #if i remove this I'll get 404 errors on any other page than the homepage.
    #but if I add it, the 'location = /' block gets ignored.
}

server {

    listen 443 ssl;

    server_name domainname.tld;

    root /var/www/domainname.tld;
    index index.php;

    ... (stuff like rewrite rules, irrelevant) ...

}

答案1

只需将其包装在一个location / { ... }块中即可赋予其同等优先级:

server {
    listen       80;
    server_name  domainname.tld;

    location = / {
        return 301 https://$server_name/homepage;
    }
    location / {
        return 301 https://$server_name$request_uri; 
    }
}

这个文件了解详情。

答案2

您可以使用正则表达式来仅匹配根 URL,如下所示。

    location ~ ^/$ {
        return 301 https://domainname.tld/homepage;
    }

但是,最好只保留 301 代码重定向到 HTTPS 站点,以及从 HTTPS 站点根目录到 的 302 代码/homepage。您不希望搜索引擎缓存 301 永久重定向。这是一个坏主意,因为该页面最终可能会发生变化。

相关内容