Назад | Перейти на главную страницу

Избегайте двойного перенаправления NGINX

Я перенаправляю пользователей своего сайта на 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; 
    }
}

Видеть этот документ для подробностей.