Перенаправление URL-адреса, отличного от www, на www с использованием .htaccess

StackOverflow https://stackoverflow.com/questions/50931

  •  09-06-2019
  •  | 
  •  

Вопрос

Я использую Переписать ISAPI Геликона 3, который в основном включает .htaccess в IIS.Мне нужно перенаправить URL-адрес, отличный от www, на версию www, т.е.example.com следует перенаправить на www.example.com.Я использовал следующее правило из примеров, но оно влияет на поддомены:

RewriteCond %{HTTPS} (on)?
RewriteCond %{HTTP:Host} ^(?!www\.)(.+)$ [NC]
RewriteCond %{REQUEST_URI} (.+)
RewriteRule .? http(?%1s)://www.%2%3 [R=301,L]

Это работает по большей части, но также перенаправляет sub.example.com на www.sub.example.com.Как я могу переписать приведенное выше правило, чтобы поддомены не перенаправлялись?

Это было полезно?

Решение

Добавьте следующий RewriteCond:

RewriteCond %{HTTP:Host} ^[^.]+\.[a-z]{2,5}$ [NC]

Таким образом, правило будет применяться только к nondottedsomething.uptofiveletters как вы можете видеть, subdomain.domain.com не будет соответствовать условию и, следовательно, не будет переписано.

Вы можете изменить [a-z] {2,5} для более строгого соответствия регулярному выражению tld, а также установить все ограничения для разрешенных символов в доменных именах (поскольку [^.]+ является более разрешительным, чем строго необходимо).

В целом, я думаю, что в данном случае в этом не было бы необходимости.

Редактировать:сэди заметила недостаток в регулярном выражении, изменила его первую часть с [^.] на [^.]+

Другие советы

Я получил больше контроля, используя urlrewriter.net, что - то вроде:

<unless header="Host" match="^www\.">
   <if url="^(https?://)[^/]*(.*)$">
     <redirect to="$1www.domain.tld$2"/>
   </if>
   <redirect url="^(.*)$" to="http://www.domain.tld$1"/>
</unless>

У Зигдона правильная идея, за исключением того, что его регулярное выражение не совсем правильное.Использование

^example\.com$

вместо его предложения о:

^example\.com(.*)

В противном случае вы будете сопоставлять не просто example.com, вы будете сопоставлять такие вещи, как example.comcast.net, example.com.au и т.д.

@Винко

Что касается вашего общего подхода, я не уверен, почему вы решили ограничить длину TLD в своем регулярном выражении?Это не очень перспективно, и я не уверен, какую пользу это дает?На самом деле это даже не "now-proof", потому что существует по крайней мере один 6-символьный TLD (.museum), который не будет сопоставлен.

Мне кажется, в этом нет необходимости.Не могли бы вы просто сделать ^[^.]+\.[^.]\+$?(примечание:вопросительный знак - это часть предложения, а не регулярное выражение!)

Несмотря на все это, существует более серьезная проблема с таким подходом, которая заключается в:это не сработает для доменов, которые не находятся непосредственно под TLD.Это домены в Австралии, Великобритании, Японии и многих других странах, которые имеют иерархию:.co.jp , .co.uk , .com.au, и так далее.

Имеет ли это какое-либо отношение к операционной системе, я не знаю, но об этом стоит знать, если вам нужен ответ "исправить все".

OP еще не ясно дал понять, хочет ли он общее решение или решение для одного (или небольшой группы) известных доменов.Если это последнее, смотрите мою другую заметку об использовании подхода Зигдона.Если это первое, то придерживайтесь подхода Винко, принимая во внимание информацию, содержащуюся в этом посте.

Редактировать:Одна вещь, которую я до сих пор упускал из виду, которая может быть или не быть вариантом для вас с точки зрения бизнеса, - это пойти другим путем.Все наши сайты перенаправляют http://www.domain.com Для http://domain.com.Люди в http://no-www.org приведите довольно веские аргументы (ИМХО) в пользу того, что это "правильный" способ сделать это, но это, безусловно, всего лишь вопрос предпочтений.Однако одно можно сказать наверняка: гораздо проще написать общее правило для такого рода перенаправлений, чем это.

@org 0100h Да, в описании проблемы упущено много переменных, и все ваши замечания являются действительными и должны быть устранены в случае реальной реализации.У предлагаемого вами регулярного выражения есть как плюсы, так и минусы.С одной стороны, это проще и перспективно, с другой, вы действительно хотите соответствовать example.foobar, если он отправлен в заголовке Host?Могут быть некоторые крайние случаи, когда вы в конечном итоге перенаправите не на тот домен.Третьей альтернативой является изменение регулярного выражения для использования списка реальных доменов, если их несколько, например

RewriteCond %{HTTP:Host} (example.com|example.net|example.org) [NC]

(Обратите внимание на Криса, что один будет изменение %1)

@chrisofspades Это не предназначено для замены, ваше условие номер два гарантирует, что у него нет www, в то время как у меня его нет.Он не изменит значения %1, %2, %3, потому что он не сохраняет совпадения (iow, он не использует круглые скобки).

Вы не можете настроить RewriteCond так, чтобы он работал только с example.com?

RewriteCond %{HTTP:Host} ^example\.com(.*) [NC]

Почему у вас просто нет чего-то подобного в вашем файле vhost (of httpd)?

ServerName: www.example.com
ServerAlias: example.com

Конечно, это не будет перенаправляться, все будет продолжаться как обычно

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