it-roy-ru.com

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] 

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

185
user121196

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

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

472
Greg Hewgill

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]
74
burzumko
<VirtualHost *:80>
    ServerAlias example.com
    RedirectMatch permanent ^/(.*) http://www.example.com/$1
</VirtualHost>
43
cherouvim

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

30
Sergio Martins
    <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.

Ура!

21
Dishan Philips

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

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

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

10
Curtis Tasker

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

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

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

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

5
Andrew Deal

Код перенаправления как для не-www => www, так и для противоположного www => не-www. Нет жесткого кодирования доменов и схем в файле .htaccess. Таким образом, домен Origin и версия 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
mikep

Перенаправить домен .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]
  • Другие sudomains все еще работают.
  • Не нужно настраивать линии. просто скопируйте/вставьте их в нужном месте.

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

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

3
xaa

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

# non-www to www
<If "%{HTTP_Host} = 'domain.com'">
  Redirect 301 "/" "http://www.domain.com/"
</If>
3
sys0dm1n
<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

2
Aneesh R S

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

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

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

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

1
Tejinder singh

Это просто!

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

Не всегда используйте 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 - Канонические имена хостов

1
MA-Maddin

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

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

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

0
Mauricio Sánchez

Я использую код:

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

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

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/

0
Santo Doni Romadhoni