Как перенаправить приложение React на HTTPS без www? - PullRequest
0 голосов
/ 28 марта 2019

Я кодирую приложение React, которое я развернул на своем веб-сервере.У меня есть следующий файл .htaccess, который обрабатывает все запросы через индексный файл, потому что я использую клиентскую маршрутизацию:

Options -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.html [QSA,L]

, которая работает.

Однако я бы хотел перенаправить весь трафик наHTTPS без www.Может ли кто-нибудь направить меня в правильном направлении, используя стандартный файл .htaccess, но через index.html:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

1 Ответ

0 голосов
/ 28 марта 2019

Легче всего сломать то, что у вас уже есть (что делает наоборот)

RewriteEngine On
RewriteCond %{HTTPS} off [OR]

Соответствует, когда запрос не выполняется через https ... довольно просто. [ИЛИ] в конце означает, что либо это правило, либо приведенное ниже должно возвращать true.

RewriteCond %{HTTP_HOST} !^www\. [NC]

это соответствует, если нет "www." в начале запроса (^ означает начало, ! означает «не»). [NC] означает «nocase», поэтому просто игнорирует регистр. Не обязательно на серверах Linux, но все же рекомендуется.

RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]

Таким образом, если HTTPS выключен или строка не начинается с www., HTTP_HOST передается в это правило. Это правило всегда будет возвращать true, так как регулярное выражение соответствует необязательному «www». (из-за ? после имени), затем один или несколько символов (.+) до конца строки ($).

Часть .+ после необязательного www. заключена в скобки, чтобы захватить ее ((?: до того, как она обозначает группу без захвата, поэтому остальная часть имени хоста захватывается как %1 - или первая захваченная группа).

RewriteRule ^ https://www.%1%{REQUEST_URI} [L,NE,R=301]

Затем переписывается запрос, включающий https://www. плюс оставшуюся часть имени хоста $1, а затем REQUEST_URI, то есть все, начиная с первого / в URI.

Бит в конце правила также довольно прост, L означает, что это последнее правило перезаписи, NE означает noescape - это полезно при включении request_uri для предотвращения его экранирования. R=301 означает перенаправление со статусом 301.


TLDR - Ваше решение

Таким образом, чтобы создать правило, которое необходимо отбросить на www., Вам нужно переключить пару из этих опций:

RewriteEngine On
RewriteCond %{HTTPS} off [OR]
RewriteCond %{HTTP_HOST} ^www\. [NC]
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteRule ^ https://%1%{REQUEST_URI} [L,NE,R=301]

На втором RewriteCond мы удаляем !, чтобы он соответствовал URL-адресу, который начинается с www., затем на RewriteRule мы удаляем www. это добавляется в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...