Apache перенаправляет с не www на www

У меня есть веб-сайт, который, похоже, не перенаправляется с не-www на www.

Моя конфигурация Apache выглядит следующим образом:

RewriteEngine On
### re-direct to www
RewriteCond %{http_host} !^www.example.com [nc]
RewriteRule ^(.*)$ http://www.example.com/$1 [r=301,nc] 

Что мне не хватает?

Ответ 1

Использование движка переписывания - довольно тяжелый способ решения этой проблемы. Вот более простое решение:

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>

<VirtualHost *:80>
    ServerName www.example.com
    # real server configuration
</VirtualHost>

И тогда у вас будет еще один раздел <VirtualHost> с ServerName www.example.com для вашей реальной конфигурации сервера. Apache автоматически сохраняет что-либо после / при использовании директивы Redirect, что является распространенным заблуждением о том, почему этот метод не будет работать (хотя на самом деле он работает).

Ответ 2

http://example.com/subdir/?lold=13666 => http://www.example.com/subdir/?lold=13666

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

Ответ 3

<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Ответ 4

Чтобы удалить www с вашего веб-сайта URL, используйте этот код в файле .htaccess:

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

Чтобы заставить www на вашем веб-сайте URL использовать этот код на .htaccess

RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^YourSite.com$
RewriteRule ^(.*)$ http://www.yourSite.com/$1 [R=301]
RewriteCond %{REQUEST_fileNAME} !-d
RewriteCond %{REQUEST_fileNAME} !-f
RewriteRule ^(([^/]+/)*[^./]+)$ /$1.html [R=301,L]

Где YourSite.com необходимо заменить на URL.

Ответ 5

    <VirtualHost *:80>
       DocumentRoot "what/ever/root/to/source"
       ServerName www.example.com

       <Directory "what/ever/root/to/source">
         Options FollowSymLinks MultiViews Includes ExecCGI
         AllowOverride All
         Order allow,deny
         allow from all
         <What Ever Rules You Need.>
      </Directory>

    </VirtualHost>

    <VirtualHost *:80>
      ServerName example.com
      ServerAlias *.example.com
      Redirect permanent / http://www.example.com/
    </VirtualHost>

Это то, что происходит с приведенным выше кодом. Первый блок виртуального хоста проверяет, является ли запрос www.example.com и запускает ваш сайт в этом каталоге.

В противном случае это относится ко второй секции виртуального хоста. Здесь ничего, кроме www.example.com, перенаправляется на www.example.com.

Здесь порядок. Если вы сначала добавите вторую директиву virtualhost, это вызовет цикл перенаправления.

Это решение перенаправит любой запрос в ваш домен, на www.yourdomain.com.

Ура!

Ответ 6

Это похоже на многие другие предложения с несколькими улучшениями:

  • Не нужно жестко кодировать домен (работает с vhosts, которые принимают несколько доменов или между средами)
  • Сохраняет схему (http/https) и игнорирует эффекты предыдущих %{REQUEST_URI} правил.
  • Часть пути, на которую не влияет предыдущий RewriteRule, такой как %{REQUEST_URI}.

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

Ответ 7

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

Это начинается с переменной HTTP_HOST, которая содержит только часть имени домена входящего URL (example.com). Предполагая, что доменное имя не содержит www. и точно соответствует вашему доменному имени, тогда вступает в действие RewriteRule. Шаблон ^(.*)$ будет соответствовать всем в REQUEST_URI, который является ресурсом, запрошенным в HTTP-запросе (foo/blah/index.html). Он хранит это в обратной ссылке, которая затем используется для перезаписи URL-адреса с новым доменным именем (которое начинается с www).

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

Ответ 8

Я запустил это...

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

Мне нужно, чтобы это было универсальным для 25+ доменов на нашем новом сервере, поэтому эта директива находится в моем файле virtual.conf в теге Directory > . (dir является родительским для всех docroots)

Мне пришлось немного взломать правило перезаписи, поскольку полный docroot переносился на совпадение шаблонов, несмотря на то, что http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html говорит об этом только о вещах после хоста и порта.

Ответ 9

Код перенаправления для не-www = > www и напротив www = > не-www. Никаких доменов и схем жесткого кодирования в файле .htaccess. Таким образом, исходный домен и версия http/https будут сохранены.

APACHE 2.4 И NEWER

NON-WWW = > WWW:

RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ %{REQUEST_SCHEME}://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

WWW = > NON-WWW:

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

Примечание: не работает на Apache 2.2, где% {REQUEST_SCHEME} недоступен. Для совместимости с Apache 2.2 используйте код ниже или замените% {REQUEST_SCHEME} на фиксированный http/https.


APACHE 2.2 И NEWER

NON-WWW = > WWW:

RewriteEngine On

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

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

... или более короткая версия...

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

WWW = > NON-WWW:

RewriteEngine On

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

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

... более короткая версия невозможна, потому что% N доступен только из последнего RewriteCond...

Ответ 10

Если вы используете Apache 2.4, без необходимости включения переписанного модуля apache, вы можете использовать что-то вроде этого:

# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>

Ответ 11

Перенаправить domain.tld на www.

Следующие строки могут быть добавлены либо в директивы Apache, либо в файле .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
  • Другие судомены все еще работают.
  • Не нужно настраивать линии. просто скопируйте/вставьте их в нужное место.

Не забывайте применять изменения apache, если вы изменяете vhost.

(основанный на стандартном Drupal7.htaccess, но должен работать во многих случаях)

Ответ 12

Попробуйте следующее:

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

Ответ 13

<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>

Это приведет к перенаправлению не только имени домена, но и внутреннего  pages.like...

 example.com/abcd.html             == >      ; www.example.com/abcd.html
example.com/ab/cd.html?ef=gh   == >   www.example.com/ab/cd.html?ef=gh

Ответ 14

Это просто!

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

Ответ 15

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

проверить эту прекрасную работу

Ответ 16

Не всегда используйте Redirect permanent (или почему это может вызвать проблемы)

Если есть вероятность, что позже вы добавите субдомены, не используйте Redirect permanent.

Потому что, если клиент использовал субдомен, который не был зарегистрирован как VirtualHost, он также может никогда не достичь этого субдомена, даже если он зарегистрирован позже.

Redirect permanent отправляет HTTP 301 Moved Permanently клиенту (браузеру), и многие из них кэшируют этот ответ навсегда (пока кеш не будет очищен [вручную]). Таким образом, использование этого поддомена будет всегда авторизоваться на www. *** без повторного запроса сервера.

см. Как долго браузеры кэшируют HTTP 301?

Так что просто используйте Redirect

<VirtualHost *:80>
  ServerName example.com

  Redirect / http://www.example.com/
</VirtualHost>

Apache.org - Когда не использовать mod_rewrite

Apache.org - Канонические имена хостов

Ответ 17

Используемый мной код:

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

Ответ 18

У меня только одна проблема. Но решил с этим

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

Это правило перенаправляет не-www на www.

И это правило для перенаправления www на не-www

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

Обратитесь к http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/

Ответ 19

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

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

Я использую шаблон с перспективой (?!www.domain.com), чтобы исключить субдомен www при перенаправлении всех доменов в субдомен www, чтобы избежать бесконечного цикла перенаправления в Apache.

Ответ 20

Альтернативный подход, если настройка .htaccess не является идеальным вариантом:

Я создал простой сервер перенаправления для публичного использования. Просто добавьте запись A или CNAME:

CNAME   r.simpleredirect.net
A       89.221.218.22

Дополнительная информация: https://simpleredirect.net

Ответ 21

Если вы используете вышеупомянутое решение из двух блоков <VirtualHost *:80> с разными ServerName s...

<VirtualHost *:80>
    ServerName example.com
    Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost *:80>
    ServerName www.example.com
</VirtualHost>

... тогда вы должны также установить NameVirtualHost On.

Если вы этого не сделаете, Apache не позволяет использовать разные ServerName для выделения блоков, поэтому вы получите это сообщение об ошибке:

[warn] _default_ VirtualHost overlap on port 80, the first has precedence

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

Ответ 22

У меня была аналогичная задача в WP Multisite, где правило перенаправления должно было быть общим (для любого заданного домена, который я бы добавил в сеть). Сначала я решил добавить подстановочный знак в домен (припаркованный домен). Обратите внимание. после .com.

CNAME * domain.com.

И затем я добавил следующие строки в файл .htaccess в корень моего мультисайта. Думаю, это сработает для любого сайта.

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

Надеюсь, это поможет.

пс. Если вы хотите перенаправить с www на www, измените последнюю строку на

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

Ответ 23

Мне было проще (и более полезно) использовать ServerAlias ​​при использовании нескольких vhosts.

<VirtualHost x.x.x.x:80>
    ServerName www.example.com
    ServerAlias example.com
    ....
</VirtualHost>

Это также работает с https vhosts.