Apache перенаправить с не www на www

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

My Apache configuration is as follows:

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

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

 hakre14 февр. 2014 г., 08:54
Для.htaccess На основании решения предлагаю вариант ответа, который был поставлен по диаметральному вопросу:stackoverflow.com/a/5262044/367456

Ответы на вопрос(22)

No need to hardcode the domain (works with vhosts that accept multiple domains or between environments) Preserves the scheme (http/https) and ignores the effects of previous %{REQUEST_URI} rules.

The path portion not affected by previous RewriteRules like %{REQUEST_URI} is.

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
 05 дек. 2018 г., 13:42
@ Майкл Вираз: не удваивает слэш здесь ?!
 13 мар. 2016 г., 16:49
Практически идеально. Это должно быть% {HTTP_HOST} $ 1, а не% {HTTP_HOST} / $ 1 (или это удвоит слеш)

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

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

The code I use is:

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

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

APACHE 2.4 AND NEWER

NON-WWW = & gt; WWW:

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

WWW = & gt; 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 AND NEWER

NON-WWW = & gt; 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 = & gt; 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 ...

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

 pages.like ...

 example.com/abcd.html & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0; & # xA0 ; & # xA0; & # xA0; & # xA0;==>& # XA0; & # xA0; & # xA0; www.example.com/abcd.html
 example.com/ab/cd.html?ef=gh & # xA0; & # xA0;==> & # XA0; & # xA0; & # xA0;? Www.example.com/ab/cd.html эф = GH

 24 янв. 2016 г., 18:32
Спасибо за это. Очень полезно.
 26 янв. 2016 г., 15:34
Добро пожаловать :)

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


RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
    <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.

Ура!

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] останавливает все дальнейшее переписывание и перенаправляет немедленно.

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

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

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.

 04 дек. 2012 г., 14:16
Какова вторая часть с .html для ??
 07 янв. 2013 г., 16:40
Удалите косую черту до $ 1, чтобы не иметь двойной косой черты (//) после перенаправления = & gt; RewriteRule ^ (. *) $yourSite.com$1 [R = 301]
 06 мар. 2017 г., 09:57
Флаги не допускаются / используются в перезаписываемую секунду ...
 04 июл. 2012 г., 17:03
Лучший ответ здесь, так как он работает для веб-сайта с несколькими доменными именами & lt; 3

<VirtualHost *:80> блоки с разнымиServerNames ...

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

... затем выmust set NameVirtualHost On as well.

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

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

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

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

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

где правило перенаправления должно было быть общим (для любого данного домена, который я добавляю в сеть). Я решил сначала добавить подстановочный знак в домен (припаркованный домен). Обратите внимание . после .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]

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

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

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

 12 окт. 2016 г., 17:37
Это позволяет вам иметь несколько доменов, на которых размещается один и тот же сайт. В зависимости от вашей ситуации и от того, что работает ваш базовый веб-сервер, у вас могут возникнуть проблемы с тем, что файлы cookie не будут перенесены, люди запутались, а также проблемы с поисковой системой (которые будут рассматриваться как 2 разных сайта).
 25 авг. 2015 г., 03:35
Очередной проезд вниз. Не могли бы вы объяснить, о могущественный бог httpd, который не удосужился объяснить понижение?
Redirect domain.tld to www.

либо в файле .htaccess:

RewriteEngine on    
RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Other sudomains are still working. No need to adjust the lines. just copy/paste them at the right place.

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

(based on the default Drupal7 .htaccess but should work in many cases)

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/

Решение Вопроса

той проблемы. Вот более простое решение:

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

 11 дек. 2010 г., 17:16
Как вы делаете это для сайта, который также имеет виртуальный хост ssl?
 08 янв. 2014 г., 17:45
Для сервера виртуального хоста, скажем example.com, у меня естьRedirect 301 / http://example2.com/extra/ но когда он перенаправляет, он пропускает косую черту, что означает, чтоexample.com/blah идет кexample2.com/extrablah, Есть идеи? (Apache 2.2.22)
 28 мар. 2011 г., 21:38
Я получаю сообщение об ошибке "Веб-страница на example.com привела к слишком большому количеству перенаправлений" при использовании этого предложения. У других есть эта проблема?
 04 авг. 2013 г., 10:03
@JonathanBerger Если у вас слишком много перенаправлений, значит, вы, вероятно, неправильно настроили файл. Убедитесь, что у вас есть 2 виртуальных хоста: один с не-www, как указано выше, а другой с ServerName www.example.com, который имеет реальную конфигурацию. Также убедитесь, что у вас нет переадресации в конфигурации www.example.com (как mod_alias, так и mod_rewrite).
 12 февр. 2012 г., 22:17
@ BlackDivine: нет ничего волшебного в том, чтобы делать это в другом направлении. Просто поменять местамиwww.example а такжеexample где бы они ни появлялись в образце.

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

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

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

Do not allways use Redirect permanent (or why it may cause issues)

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

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

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

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

So just use Redirect

<VirtualHost *:80>
  ServerName example.com

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

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

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

http://example.com/subdir/?lold=13666 = & GT;http://www.example.com/subdir/?lold=13666

RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
 12 сент. 2017 г., 20:10
Я использовал это решение и для виртуальных хостов HTTPS. Просто добавьтеs http в третьем ряду.
 20 авг. 2014 г., 01:02
О, это хорошо, это может быть включено в конфигурацию сервера на верхнем уровне (и если так) будет применяться к каждому виртуальному хосту!
 11 окт. 2012 г., 12:01
очень короткий ответ ... но по пунктам ... не уверен, если это голосование "за" или "против"
 18 мар. 2015 г., 14:08
Здравствуйте @burzumko, как вы этого добиваетесь, что верно для всех без www, но тогда позвольте, скажем,example.com/subdi1/ws/*  пройти без www?
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
 10 мая 2014 г., 23:28
Вы правы, я случайно поставил www. в ServerAlias используя *. подстановочные. Поскольку я испортил порядок записей VirtualHost, *. У подстановочного знака была возможность подойти, когда я не думал, что это будет.
 03 мая 2014 г., 15:28
@ dmiller309: Вы случайно включилиwww. вServerAlias?
 31 янв. 2015 г., 10:35
Это лучший ответ, потому что он чистый, сохраняет путь (в отличие от ответа № 1) и не использует перезапись.
 03 мая 2014 г., 08:09
Это не сработало для меня; это вызвало бесконечный цикл перенаправления на тот же сайт

Ваш ответ на вопрос