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

Перенаправление Htaccess на https и www с помощью одного RewriteRule

У меня в моем .htaccess файл:

RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule .* https://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Он работает в браузере должным образом, перенаправляя весь трафик на https://www.example.com/.

Но я использую POS-систему, которая автоматически загружает продукты на веб-сайт, и, по-видимому, этому настольному приложению не нравится больше одного RewriteRule. Он жалуется, что его интернет-магазин не установлен. Как только я удаляю одно из правил, он становится счастливым.

Итак, мой вопрос: есть ли способ объединить это в один RewriteRule?

... не любит больше одного RewriteRule.

Это необычное требование. Вероятно, он жалуется на множественные перенаправляет при запросе http://example.com, а не буквально количество RewriteRule директивы?

Эту проблему можно решить, убедившись, что вы перенаправляете на канонический URL-адрес в первом RewriteRule директива. Итак, вместо:

RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Вы бы написали:

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

Или, чтобы сохранить это «общее», без явного включения имени домена в RewriteRuleпопробуйте следующее:

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

не замужем RewriteRule

Затем вы можете расширить приведенное выше, чтобы создать один RewriteRule для канонизации как HTTPS, так и www. Попробуйте следующее:

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

Для всех запросов HTTP или не начинайте www затем перенаправьте на канонический URL. Третий RewriteCond требуется директива для захвата домена (за исключением необязательного www. префикс) от хоста. В %1 это обратная ссылка на последний найденный CondPattern т.е. (.+). Если вы просто жестко запрограммировали каноническое имя хоста в RewriteRule замена тогда вам не понадобится это третье условие.