我正在使用 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 永久重定向。这是一个坏主意,因为该页面最终可能会发生变化。