Вопрос

У меня есть веб-сайт, который, похоже, не перенаправляет с не-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>

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

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

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

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> блоки с различными ServerNames...

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

...тогда ты необходимо установить NameVirtualHost On также.

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

[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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top