в 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
сайт используйте этот код в ваш.htaccess
file: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, это вызовет цикл перенаправления.
Это решение перенаправит любой запрос к вашему домену, чтобы www.yourdomain.com.
Ура!
Это похоже на многие другие предложения с пару улучшений:
- нет необходимости жестко кодировать домен (работает с vhosts, которые принимают несколько доменов или между средами)
- сохраняет схему (http / https) и игнорирует эффекты предыдущего
%{REQUEST_URI}
правила.часть пути, не затронутая предыдущим
RewriteRule
s как%{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 или в .файл 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 .реврайт, но должен работать во многих случаи)
<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
клиенту (браузеру) и многие из них кэшируют этот ответ навсегда (пока кэш не будет очищен [вручную]). Поэтому использование этого поддомена всегда будет автоматически перенаправляться на www.*** без повторного запроса сервера.посмотреть как долго браузеры кэшируют HTTP 301s?
так что просто используйте
Redirect
<VirtualHost *:80> ServerName example.com Redirect / http://www.example.com/ </VirtualHost>
попробуйте это:
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 на non-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>
блоков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
s, чтобы выделить блоки, так что вы получите это сообщение об ошибке:[warn] _default_ VirtualHost overlap on port 80, the first has precedence
...и либо никакого перенаправления не происходит, либо у вас есть бесконечный цикл перенаправления, в зависимости от того, какой блок вы ставите первым.
у меня была аналогичная задача на Мультисайте WP, где правило перенаправления должно было быть общим (для любого данного домена я бы добавил в сеть). Я решил сначала добавить подстановочный знак в домен (припаркованный домен). Обратите внимание . после .ком.
CNAME * domain.com.
и затем я добавил следующие строки .файл htaccess в корне моего мультисайта. Я думаю, это сработает для любого сайта.
RewriteEngine On RewriteBase / RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC] RewriteRule ^(.*)$ http://%1/ [R=301,L]
надеюсь, это поможет.
ps. Если вы хотите перенаправить с не www на www, измените последнюю строку на
RewriteRule ^(.*)$ http://www.%1/ [R=301,L]