Подтвердить что ты не робот

.htaccess перенаправить www на не-www с SSL/HTTPS

У меня есть несколько доменов, работающих в одном файле .htaccess, каждый из которых имеет сертификат SSL.

Мне нужно установить префикс https для каждого домена, а также обеспечить возможность перенаправления версий www версии no-www.

Ниже мой код; это не работает:

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

Чего я хочу добиться, так это перенаправить что-то вроде https://www.example.com на https://example.com.

Что я делаю не так и как мне этого добиться?

4b9b3361

Ответ 1

www для не www с https

RewriteEngine on

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

RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

Ответ 2

Ваше условие никогда не будет истинным, потому что это похоже на "if (a == a + b)".

Я бы попробовал следующее:

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]

Это приведет к захвату "google.com" с "www.google.com" в% 1, остальное - в $1, а после этого - 2, когда HTTP_HOST начинается с www (с или без https).

Ответ 3

Ссылка: Apache перенаправляет www на не-www и HTTP на HTTPS

http://example.com

http://www.example.com

https://www.example.com

в

https://example.com

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]

Если вместо example.com вы хотите, чтобы URL по умолчанию был www.example.com, просто измените третью и пятую строки:

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]

Ответ 4

Чтобы принудительно использовать не-www и https в одном запросе, вы можете использовать следующее правило в htaccess:

RewriteEngine on

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

Это перенаправляет http://www.example.com/ или https://www.example.com/ на ssl без www https://example.com/.

Я использую флаг R Temp Redirect для тестирования и во избежание кэширования браузера. Если вы хотите сделать редирект постоянным, просто изменить флаг R к R = 301.

Ответ 5

Сертификат должен охватывать как www, так и не-www https. Некоторые сертификаты поставщиков охватывают как для www.xxxx.yyy, но только для xxxx.yyy.

Включить перезапись:

RewriteEngine On

Сделать все http-использование https:

RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://xxx.yyy/$1 [L,R=301]

Сделать только www https использовать не-www https:

RewriteCond %{SERVER_PORT} 443
RewriteCond %{HTTP_HOST} ^www[.].+$
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [L,R=301]

Невозможно обрабатывать не-www https, в противном случае возникает цикл.

В [L, R = 301]:

  • L = Если правило было обработано, не обрабатывайте больше.
  • R = 301 = Сообщает обозревателю/роботу о постоянной переадресации.

Более общий

Более общий подход - не зависит от порта - это:

RewriteCond %{HTTP_HOST} ^www\.
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]

чтобы сделать любой URL с www отбросить его.

RewriteCond %{HTTPS} !on
RewriteCond %{HTTPS} !1
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteCond %{HTTP:X-Forwarded-SSL} !on
RewriteRule ^(.*)$ https://xxxx.yyy/$1 [R=301,QSA]

чтобы заставить любой URL-адрес, отличный от https, даже для тех систем, которые находятся ниже по потоку от балансировщиков нагрузки, которые снижают https, используйте https.

Обратите внимание, что я не тестировал параметры forwarded, поэтому буду благодарен за отзывы о любых проблемах с ними. Эти линии могут быть опущены, если ваша система не находится за балансировщиком нагрузки.

К HTTP_HOST или не

Вы можете использовать ${HTTP_HOST}, чтобы быть частью URL-адреса в RewriteRule, или вы можете использовать текст явного канонического имени домена (xxxx.yyy выше).

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

Это может даже помочь преобразовать домены, закодированные в режиме punycode, чтобы показать правильные символы Юникода в адресной строке.

Ответ 6

Это сработало для меня:

RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

Ответ 7

RewriteEngine On

RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]

Это сработало для меня после долгих проб и ошибок. Часть первая от пользователя выше и будет захватывать www.xxx.yyy и отправить на https://xxx.yyy

Часть 2 просматривает введенный URL-адрес и проверяет, HTTPS, если нет, он отправляет HTTPS

Выполняется в этом порядке, это следует за логикой и не происходит ошибок.

ЗДЕСЬ моя ПОЛНАЯ версия в стороне htaccess с WordPress:

RewriteEngine On
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^.*$ https://%1/$1 [R=301,L]

RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R,L]


# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

Ответ 8

Для меня было лучше жестко закодировать "example.com" в виде строки, поэтому мне нужно меньше правил, даже вы можете использовать его для перенаправления с .org на .com или аналогичный:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteCond %{HTTP_HOST} !^example\.com$ [NC]
  RewriteRule ^ https://example.com%{REQUEST_URI} [L,NE,R=301]
</IfModule>

Ответ 9

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]

Это работает для меня отлично!