перенаправление apache с не www на www

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

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

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

что я упустил?

21 ответов


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

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


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]

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

удалить www из своего URL сайт используйте этот код в ваш :

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

в законную силу www на сайте URL используйте этот код на .htaccess

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

здесь YourSite.com нужно заменить на URL.


    <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, это вызовет цикл перенаправления.

это решение перенаправит любые запрос к вашему домену, to www.yourdomain.com.

Ура!


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

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

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

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

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

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


Я побежал...

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

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

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


код перенаправления для безопаснотсть => 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 => 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 И НОВЕЕ

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 доступен только с последней перезаписи ...


редирект домена.tld-www.

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

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

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

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


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

это перенаправит не только доменное имя, но и внутреннее страницы.как...

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


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

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

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

проверьте эту идеальную работу


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

если есть шанс, что вы добавите поддомены позже, не используйте redirect permanent.

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

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

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

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

<VirtualHost *:80>
  ServerName example.com

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

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

Apache.org Канонические Имена


попробуйте это:

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

у меня просто такая же проблема. Но решается с помощью этого

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

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

и это правило для перенаправления www на без www

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

см.http://dense13.com/blog/2008/02/27/redirecting-non-www-to-www-with-htaccess/


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

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

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


код, который я использую:

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

при использовании вышеуказанного решения из двух <VirtualHost *:80> блоков ServerNames...

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

... тогда ты!--9-->должны NameVirtualHost On а также.

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

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

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


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

CNAME * domain.com.

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

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

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

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

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

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

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

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