Перенаправить не-www на www в .htaccess

У меня есть это в моем файле .htaccess:

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

но всякий раз, когда я обращаюсь к файлу на моем корне, например http://example.com/robots.txt, он перенаправляется на http://www.example.comrobots.txt/.

Как я могу исправить это, чтобы он правильно перенаправлял http://www.example.com/robots.txt?

Ответ 1

Измените свою конфигурацию на это (добавьте косую черту):

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

Или решение, описанное ниже (предложенное @absiddiqueLive), будет работать для любого домена:

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

Если вам необходимо поддерживать http и https и сохранить выбор протокола, попробуйте следующее:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Где вы заменяете login на checkout.php или любой URL-адрес, необходимый для поддержки HTTPS.

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

Ответ 2

Здесь правильное решение, которое поддерживает https и http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Ответ 3

RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Для Https

RewriteCond %{HTTPS}s ^on(s)|

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

Ответ 4

Следующий пример работает как с ssl, так и с не-ssl и работает намного быстрее, поскольку вы используете только одно правило для управления http и https

RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s on(s)|offs()
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

[Испытано]

Это перенаправит

HTTP

к

HTTPS

к

Ответ 5

Попробуйте это, я использовал его на многих сайтах, он отлично работает

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]

Ответ 7

Эта конфигурация работала для меня в bitnami wordpress с настроенным SSL:

Добавлено ниже под "RewriteEngine On" в файле /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Ответ 8

Я проверил все вышеупомянутые решения, но не работал для меня, я пытался удалить http://и не буду перенаправлять, а также удалил www, он перенаправляет хорошо, поэтому я запутался, особенно я запускаю все свои сайты под https ://

Поэтому я объединил несколько кодов вместе и придумал идеальное решение для http://и https://, а также для www и non-www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Надеюсь, что это может помочь кому-то :)

Ответ 9

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

Это перенаправит ваш домен, который не запущен с помощью WWW Он не перенаправляет весь ваш домен.

Это полезно.

Ответ 10

Я считаю, что главный ответ успешно перенаправляет не-www на www (ex: mysite.com → www.mysite.com), но не учитывает поддомены подстановочных знаков, что приводит к

random.mysite.com -> www.random.mysite.com

Здесь решение с/без HTTPS

HTTP

RewriteEngine On

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ http%{ENV:protossl}://www.mysite.com/$1 [L,R=301] 

HTTP/HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

RewriteCond %{HTTP_HOST} !www.mysite.com$ [NC]
RewriteRule ^(.*)$ %{ENV:protocol}://www.mysite.com/$1 [L,R=301]

* note: Я не тестировал https, потому что в настоящее время у меня нет сертификата для тестирования, но если кто-то может проверить или оптимизировать то, что у меня есть, это будет потрясающе.

Ответ 11

Если возможно, добавьте это в основной файл конфигурации Apache. Это более легкое решение, требующее меньше обработки.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin [email protected]
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Таким образом, отдельный VirtualHost для "example.com" захватывает эти запросы, а затем постоянно перенаправляет их на ваш основной VirtualHost. Таким образом, нет никакого анализа REGEX с каждым запросом, и ваши клиентские браузеры будут кэшировать перенаправление, чтобы они никогда (или редко) не запрашивали "неправильный" URL-адрес, сохраняя при загрузке сервера.

Обратите внимание, конечная косая черта в Redirect permanent / http://www.example.com/. Без него перенаправление из example.com/asdf будет перенаправлено на http://www.example.comasdf вместо http://www.example.com/asdf.

Ответ 12

Два предупреждения

Избегайте 301 и предпочитайте современные коды состояния ответа 303 или 307.

Избегайте 301

Подумайте внимательно, действительно ли вам нужен постоянный редирект, обозначенный как [R=301], потому что, если вы решите изменить его позже, предыдущие посетители страницы продолжат видеть страницу исходного перенаправления.

Информация о постоянном перенаправлении часто хранится в кэше браузера, и, как правило, ее трудно устранить (перезагрузка страницы не решает проблему). Посетители вашего сайта застрянут в предыдущем перенаправлении "навсегда".

Избегайте 302 тоже

В новой версии протокола HTTP (v1.1) добавлены два новых кода состояния ответа, которые можно использовать вместо 302.

  • 303 URL перенаправление, но требуется изменить тип запроса на GET.
  • 307 Перенаправление URL, но требуется сохранить тип запроса в том виде, в котором он был первоначально отправлен.

Вы все еще можете использовать код 302 (непостоянное перенаправление), хотя это считается неоднозначным. В любом случае, большинство браузеров реализуют 302 таким же образом, как инструктирует новый код 303.

Ответ 13

Записать в .htaccess:)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]