Я перенаправляю пользователей своего сайта на HTTPS-версию сайта, используя перенаправление 301 с Nginx.
Я протестировал свой сайт с помощью PageSpeed от Google и обнаружил, что выполняю двойное перенаправление с главной страницы. Это из-за моей CMS. Пример:
http: // domain.tld -> NGINX 301 -> на https: // domain.tld -> перенаправление CMS -> https: // domain.tld / homepage
Я надеялся, что смогу перенаправить прямую корневую ссылку с помощью NGINX с
location = / {
return 301 https:// domain.tld/homepage;
}
это работает для домашней страницы, однако это приведет к ошибке 404 на любой другой странице http, кроме домашней страницы, я попытался добавить return 301 https://$host$request_uri;
под блоком местоположения, но каким-то образом это перезаписывает правило корневого домена. (которые снова дают двойное перенаправление) Есть ли способ перенаправить все ссылки с их соответствующими request_uri, КРОМЕ для корневого домена?
P.S. Я надеялся сделать это без 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) ...
}
Вы можете использовать регулярное выражение для соответствия только корневому URL-адресу, например так.
location ~ ^/$ {
return 301 https://domainname.tld/homepage;
}
Однако лучше оставить его с кодом 301, перенаправляющим только на сайт HTTPS, и кодом 302 из корня сайта HTTPS на сайт /homepage
. Вы же не хотите, чтобы поисковые системы кешировали постоянное перенаправление 301. Это плохая идея, потому что эта страница, скорее всего, со временем изменится.
Просто заверните его в location / { ... }
блок, чтобы дать ему равный приоритет:
server {
listen 80;
server_name domainname.tld;
location = / {
return 301 https://$server_name/homepage;
}
location / {
return 301 https://$server_name$request_uri;
}
}
Видеть этот документ для подробностей.