Перенаправление URL без www на www с использованием .htaccess - PullRequest
6 голосов
/ 09 сентября 2008

Я использую ISAPI Rewrite 3 от Helicon 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. Как я могу переписать вышеприведенное правило, чтобы субдомены не перенаправлялись?

Ответы [ 7 ]

3 голосов
/ 09 сентября 2008

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

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

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

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

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

РЕДАКТИРОВАТЬ: Сэди заметила недостаток в регулярном выражении, изменив первую часть с [^.] На [^.] +

1 голос
/ 10 сентября 2008

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

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

(Примечание для Криса: один изменит % 1)

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

1 голос
/ 09 сентября 2008

@ Винко

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

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

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

Независимо от того, имеет ли это какое-либо отношение к ФП, я не знаю, но это то, что нужно знать, если вы ищете ответ "исправить все".

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

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

1 голос
/ 09 сентября 2008

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

^example\.com$

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

^example\.com(.*)

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

1 голос
/ 09 сентября 2008

Я получил больше контроля, используя 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>
0 голосов
/ 09 сентября 2008

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

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

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

0 голосов
/ 09 сентября 2008

Не можете ли вы настроить RewriteCond для работы только на example.com?

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