Ответ 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]
У меня есть несколько доменов, работающих в одном файле .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
.
Что я делаю не так и как мне этого добиться?
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]
Ваше условие никогда не будет истинным, потому что это похоже на "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).
Ссылка: Apache перенаправляет www на не-www и HTTP на HTTPS
в
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]
Чтобы принудительно использовать не-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.
Сертификат должен охватывать как 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]:
Более общий
Более общий подход - не зависит от порта - это:
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, чтобы показать правильные символы Юникода в адресной строке.
Это сработало для меня:
RewriteEngine On
RewriteCond %{HTTPS} on
RewriteCond %{HTTP_HOST} ^www\.(.*)
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
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
Для меня было лучше жестко закодировать "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>
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]
Это работает для меня отлично!