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

Я перенаправляю пользователей моего сайта на HTTPS-версию сайта, используя перенаправление 301 с Nginx.
Я протестировал свой сайт с помощью PageSpeed ​​от Google и обнаружил, что выполняю двойное перенаправление с главной страницы. Это из-за моей CMS. Пример:
http: // domain.tld -> NGINX 301 -> на https: // domain.tld -> CMS redirect -> https: // domain.tld / homepage

Я надеялся, что смогу перенаправить прямую корневую ссылку используя NGINX с

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

, это работает для домашней страницы, однако это приведет к ошибке 404 на любой другой http-странице, кроме домашней, я попытался добавить 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
задан 14 September 2016 в 15:35
2 ответа

Просто оберните его в блок location / {...} , чтобы придать ему одинаковый приоритет:

server {
    listen       80;
    server_name  domainname.tld;

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

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

1
ответ дан 3 December 2019 в 20:34

Вы можете использовать регулярное выражение для сопоставления только корневого URL-адреса, как это.

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

Однако лучше оставить его с кодом 301, перенаправляющим только на сайт HTTPS, и код 302 из корня сайта HTTPS на / домашнюю страницу . Вы же не хотите, чтобы поисковые системы кешировали постоянное перенаправление 301. Это плохая идея, потому что эта страница, скорее всего, со временем изменится.

1
ответ дан 3 December 2019 в 20:34

Теги

Похожие вопросы