Apache перенаправить с не www на www - PullRequest
195 голосов
/ 09 июля 2009

У меня есть веб-сайт, который не перенаправляется с не-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] 

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

Ответы [ 22 ]

481 голосов
/ 09 июля 2009

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

<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 , что является распространенным заблуждением о том, почему этот метод не будет работать (хотя на самом деле он работает).

76 голосов
/ 24 июля 2012

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]
44 голосов
/ 09 июля 2009
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
30 голосов
/ 14 июля 2009

Чтобы удалить 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.

21 голосов
/ 16 января 2014
    <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.

Ура!

15 голосов
/ 17 июля 2015

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

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

    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
    
10 голосов
/ 09 июля 2009
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] останавливает все дальнейшее переписывание и немедленно перенаправляет.

5 голосов
/ 20 января 2017

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

APACHE 2.4 и новее

NON-WWW => WWW:

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

WWW => НЕ 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 и новее

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 => НЕ 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 ...

5 голосов
/ 16 июня 2010

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

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

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

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

4 голосов
/ 15 апреля 2016

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

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