Перенаправити не-www на www у .htaccess


189

Я маю це у своєму .htaccess файлі:

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

але щоразу, коли я отримую доступ до файлу в моєму корені, http://example.com/robots.txtвін як би перенаправляє http://www.example.comrobots.txt/.

Як я можу це виправити, щоб воно перенаправлялось правильно http://www.example.com/robots.txt?

Відповіді:


391

Змініть конфігурацію до цього (додайте косу рису):

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

Або рішення, викладене нижче (запропоноване @absiddiqueLive ), буде працювати для будь-якого домену:

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

Якщо вам потрібно підтримувати http та https та зберегти вибір протоколу, спробуйте наступне:

RewriteRule ^login\$ https://www.%{HTTP_HOST}/login [R=301,L]

Де ви замінюєте loginз checkout.phpабо будь-який URL ви повинні підтримувати HTTPS на.

Я б заперечував, що це погана ідея. Для міркувань прочитайте цю відповідь .


Це рішення не працює, коли деякі сторінки (наприклад, логін або реєстрація) використовують протокол https.
Олексій Косов

Я трохи оновив публікацію, щоб включити деяку інформацію. Важко і загально, і правильно вибрати протокол для використання.
Полювання на Рендалла

3
Перше рішення недостатньо переспрямоване, друге, здається, перенаправляє занадто багато. Наприклад blog.example.comстаєwww.blog.example.com
gman

Не могли б ви також додати, як уникнути переадресації під час розвитку на localhost?
Багз Зайчик

я слідкував за всім тут, але нічого не працює. Я використовую налаштування laravel. Хтось має ідею, чому це не працює для мене? www.domain.com і domain.com обидва завантажуються належним чином, але domain.com не переспрямовується на www.domain.com. Чи може це бути проблемою з моїм DNS?
привіт світ

93

Ось правильне рішення, яке підтримує https та http:

# Redirect to www
RewriteCond %{HTTP_HOST} ^[^.]+\.[^.]+$
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

7
Це ідеально, він також не перенаправляє субдомени так, wwwяк це роблять інші загальні рішення.
Фабіан Шменглер

4
Це найкраще рішення, працює набагато краще, ніж прийнята відповідь, і належним чином доглядає за HTTPS
Тамік Созієв

3
Працює чудово! І в таких кількох рядках!
zeckdude

8
ЦЕ НАЙКРАЩІЙ ВІДПОВІДЬ
Андрій

8
Якщо я не помиляюся, це не працюватиме більше однієї крапки. Приклади:yoursite.co.uk
TrashyMcTrash

82
RewriteEngine On

RewriteCond %{HTTP_HOST} !^www\.

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

Для Https

RewriteCond %{HTTPS}s ^on(s)|

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

7
Це рішення є кращим для @ ranman's, оскільки воно буде працювати для всіх доменів, таким чином мінімізуючи помилки людини, коли ви реалізуєте код для нового проекту, або коли ви реалізуєте додаткові домени до існуючого проекту.
Френкі

Я вважаю за краще це рішення, але чому ^(.*)$замість цього (.*)?
Popnoodles

це рішення краще, але я відредагував шахту, щоб містити і ваше.
Полювання на Рендалла

1
Це працює для всієї галузі, її просто і ефективно! Дякую
eirenaios

ви можете дотримуватися RewriteCond% {HTTPS} s ^ on (s) | RewriteRule ^ http% 1: //www.% {HTTP_HOST} / $ 1 [R = 301, L]
absiddiqueLive

24

Наступний приклад працює як на ssl, так і на non-ssl і набагато швидше, оскільки ви використовуєте лише одне правило для керування http та https

RewriteEngine on


RewriteCond %{HTTP_HOST} !^www\.
RewriteCond %{HTTPS}s on(s)|offs()
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [NE,L,R]

[Випробувано]

Це перенаправить

http

до

https

до


1
Дуже близько до того, що я придумав. Підтримується більше однієї точки в хості HTTP, наприклад, "mysite.co.uk".
Адамбій

2
Щойно з цікавості, чому ти тут не використовуєш R = 301? За замовчуванням він використовуватиме 302 (переміщений темп.), Якщо код не вказаний.
Марк

1
Працює чудово. Це має бути прийнятою відповіддю.
Джеймс Нісбет

8

Спробуйте це, я використовував це на багатьох веб-сайтах, він прекрасно працює

Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} ^bewebdeveloper.com$
RewriteRule ^(.*) http://www.bewebdeveloper.com/$1  [QSA,L,R=301]

4

Я перевірив усі вищезазначені рішення, але не працював для мене, я спробував видалити http: // і не переспрямував також видалив www, він перенаправляє добре, тому я заплутався, спеціально я запускаю всі мої сайти під https : //

Тож я поєднав кілька кодів разом і придумав ідеальне рішення як для http: //, так і для https: // і www, і non-www.

# HTTPS forced
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{SERVER_NAME}%{REQUEST_URI} [R=301,L]
# Redirect to www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L]
</IfModule>

Сподіваюся, це може комусь допомогти :)



3

Ця конфігурація працювала для мене в WordPress bitnami з налаштованим SSL:

Додано нижче під "RewriteEngine On" у файлі /opt/bitnami/apps/wordpress/conf/httpd-app.conf

RewriteCond %{HTTP_HOST} .
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteRule ^ http%{ENV:protossl}://www.%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
RewriteBase /
RewriteCond %{HTTPS} !on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

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

Це перенаправить ваш домен, який не запускається з WWW. Це не перенаправить весь ваш домен.

Це корисно.


2

Я вважаю, що головна відповідь успішно переспрямовує не-www до www (наприклад: mysite.com -> www.mysite.com ), але не враховує піддомен підстановки, що призводить до:

random.mysite.com -> www.random.mysite.com

Ось рішення з / без HTTPS

HTTP

RewriteEngine On

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

HTTP / HTTPS

RewriteEngine On

RewriteCond %{HTTPS} =on
RewriteRule ^(.*)$ - [env=protocol:https]

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ - [env=protocol:http]

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

* Примітка: я не тестував https, тому що зараз не маю сертифіката для тестування, але якщо хтось може перевірити або оптимізувати те, що у мене є, це було б дивним.


Що тут робить перший $: '^ (. *) $'
Вайшал Патель

0

Якщо можливо, додайте це до головного файлу конфігурації Apache. Це легше ваговий розчин, менше обробка необхідна.

<VirtualHost 64.65.66.67>
        ServerName example.com
        Redirect permanent / http://www.example.com/
</VirtualHost>
<VirtualHost 64.65.66.67>
   ServerAdmin me@example.com
   ServerName www.example.com
   DocumentRoot /var/www/example
   .
   .
   . etc

Отже, розділ VirtualHostдля "example.com" фіксує ці запити, а потім постійно перенаправляє їх до вашого основного VirtualHost. Таким чином, REGEX не аналізує кожен запит, і ваші клієнтські веб-переглядачі кешуватимуть перенаправлення, щоб вони більше ніколи (або рідко) запитували «неправильний» URL-адресу, економлячи вас на завантаженні сервера.

Зверніть увагу, кінець косої риски в Redirect permanent / http://www.example.com/. Без цього переадресація з example.com/asdfперенаправлення на, http://www.example.comasdfа не на http://www.example.com/asdf.


0

Два попередження

Уникайте 301 і віддайте перевагу сучасним кодам статусу відповідей 303 або 307.

Уникайте 301

Подумайте, чи справді вам потрібен постійний переспрямування, як [R=301]якщо б ви вирішили його змінити пізніше, то попередні відвідувачі сторінки продовжуватимуть бачити сторінку оригінального переадресації.

Інформація про постійне перенаправлення часто зберігається в кеші браузера і, як правило, важко усунути (перезавантаження сторінки не вирішить проблему). Відвідувачі вашого веб-сайту будуть застрягли в попередньому переадресації «назавжди».

Уникайте і 302

Нова версія протоколу HTTP (v1.1) додала два нові коди статусу відповіді, які можна використовувати замість 302.

  • 303 Перенаправлення URL-адреси, але вимагає змінити тип запиту на GET.
  • 307 Перенаправлення URL-адреси, але вимагає зберегти тип запиту як спочатку надісланий.

Ви все одно можете використовувати код 302(непостійне перенаправлення), хоча він вважається неоднозначним. У будь-якому випадку, більшість браузерів реалізує 302таким же чином новий 303код.


щодо вашого попередження про 301, це стосуватиметься, навіть якщо ми говоримо про те саме ім’я домену? не дуже впевнений, як це застосовуватиметься в цьому випадку ... перенаправлення всіх URL-адрес з http://example.com/testingна http://www.example.com/testing. Може бути поганим підходом у довгостроковій перспективі? Дякую,
Сара_

-1

Пишіть у .htaccess :)

## Redirect from non-www to www (remove the two lines below to enable)
    RewriteCond %{HTTP_HOST} !^www\. [NC]
    RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

1
Те саме, що й інші відповіді
Анкіт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.