перенаправление apache с не www на www
-
11-09-2019 - |
Вопрос
У меня есть веб-сайт, который, похоже, не перенаправляет с не-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]
Что я упускаю из виду?
Решение
Использование механизма перезаписи - довольно сложный способ решения этой проблемы.Вот более простое решение:
<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/$1
</VirtualHost>
Чтобы удалить 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
.
<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
с нравится%{REQUEST_URI}
есть.RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteRule ^(.*)$ %{REQUEST_SCHEME}://www.%{HTTP_HOST}/$1 [R=301,L]
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]
останавливает все дальнейшие перезаписи и немедленно перенаправляет.
Я проверил это...
RewriteEngine on
RewriteCond %{HTTP_HOST} !^www.*$ [NC]
RewriteRule ^/.+www\/(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]
Мне нужно, чтобы это было универсальным для более чем 25 доменов на нашем новом сервере, поэтому эта директива находится в моем файле virtual.conf в <Directory> бирка.(dir является родительским для всех docroots)
Однако мне пришлось немного подправить правило перезаписи, поскольку полный docroot выполнялся при сопоставлении с шаблоном, несмотря на то, что http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html говорит о том, что это только материал после хоста и порта.
Код перенаправления как для не-www => www, так и для противоположного www => не-www.Нет жесткого кодирования доменов и схем в файле .htaccess.Таким образом, исходный домен и версия http / https будут сохранены.
APACHE 2.4 И НОВЕЕ
НЕ-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 И НОВЕЕ
НЕ-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 доступно только с последней секунды перезаписи ...
Если вы используете Apache 2.4 , без необходимости включать модуль rewrite apache, вы можете использовать что-то вроде этого:
# non-www to www
<If "%{HTTP_HOST} = 'domain.com'">
Redirect 301 "/" "http://www.domain.com/"
</If>
Перенаправить домен.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]
- Другие домены sudomain все еще работают.
- Нет необходимости корректировать линии.просто скопируйте / вставьте их в нужное место.
Не забудьте применить изменения apache, если вы изменяете vhost.
(основан на файле Drupal7 .htaccess по умолчанию, но должен работать во многих случаях)
<VirtualHost *:80>
ServerAlias example.com
RedirectMatch permanent ^/(.*) http://www.example.com/$1
</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
Попробуй это:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^example.com$ [NC]
RewriteRule ^(.*) http://www.example.com$1 [R=301]
Это просто!
RewriteEngine On
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
RewriteEngine On
RewriteCond %{HTTP_HOST} ^yourdomain.com [NC]
RewriteRule ^(.*)$ http://www.yourdomain.com/$1 [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} !^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/
Это работает для меня:
RewriteCond %{HTTP_HOST} ^(?!www.domain.com).*$ [NC]
RewriteRule ^(.*)$ http://www.domain.com$1 [R=301,L]
Я использую модель заглядывания вперед (?!www.domain.com)
чтобы исключить www
поддомен при перенаправлении всех доменов на www
поддомен, чтобы избежать бесконечного цикла перенаправления в Apache.
Код я использую:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$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, где правило перенаправления должно было быть общим (для любого заданного домена, который я бы добавил в сеть).Сначала я решил добавить подстановочный знак к домену (припаркованный домен).Обратите внимание на .после .com.
CNAME * domain.com.
А затем я добавил следующие строки в файл .htaccess в корневом каталоге моего мультисайта.Я думаю, это сработало бы для любого сайта.
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
RewriteRule ^(.*)$ http://%1/$1 [R=301,L]
Надеюсь, это поможет.
ps.Если вы хотите перенаправить с not www на www, измените последнюю строку на
RewriteRule ^(.*)$ http://www.%1/$1 [R=301,L]
Я обнаружил, что проще (и полезнее) использовать ServerAlias при использовании нескольких виртуальных хостов.
<VirtualHost x.x.x.x:80>
ServerName www.example.com
ServerAlias example.com
....
</VirtualHost>
Это также работает с vhosts https.