Как перенаправить строки запроса с ISAPI Rewrite? - PullRequest
1 голос
/ 02 марта 2011

Я использую следующие строки в моем файле httpd.ini, чтобы перенаправить пользователей, которые обращаются к example.com, на www.example.com:

RewriteCond Host: (?:www\.)?example.com
RewriteRule (.*) http\://www.example.com [RP,L]

. Я хотел бы знать, как перенаправлять строки запросадоступ пользователя к моему сайту без www, например:

мой доступ пользователя:

example.com?a=1&b=2
example.com/a/b

Я бы хотел перенаправить на:

www.example.com?a=1&b=2
www.example.com/a/b

Кто-то может помочьмне, пожалуйста?

Большое спасибо.

1 Ответ

4 голосов
/ 05 июля 2011

Похоже, вы используете isapi_rewrite v2, поэтому я отвечу за эту версию. Синтаксис v3 немного отличается.

В первой строке, мне кажется, нужна ! для негативного взгляда на www. Как показано, он соответствует www вместо not-www.

Ответ включает в себя захват фрагментов URL, а затем их использование в перезаписи с подматрицами $ 1, $ 2 и т. Д.

RewriteCond Host: (?!www\.)example.com
RewriteRule (.*) http\://www.example.com$1 [I,RP]


Вы можете сделать его более универсальным для любого домена, просто скопировав его на другие веб-сайты, захватив вместо example.com. Это первый захват $ 1, в то время как остальная часть URL теперь составляет $ 2.

RewriteCond Host: (?!www\.)(.*)
RewriteRule (.*) http\://www.$1$2 [I,RP]


Приведенное выше правило всегда будет перенаправлять на http, даже если страница была https. Если вы хотите сохранить http или https как есть, например, от https://example.com/a?b=1 до https://www.example.com/a?b=1, найдите флаг https и замените «s». Это сложно описать словами: он ищет значение переменной сервера HTTPS «включено» и сохраняет его, если оно «включено» (теперь это 2-й захват), и не сохраняет его, если это что-то еще. Затем, как правило,? 2 проверяет, есть ли второй захват. Если это так, он добавляет 's', в противном случае (двоеточие), он ничего не добавляет (ничего после двоеточия). В этом наборе остальная часть URL теперь является третьей подстрокой.

RewriteCond Host: (?!www\.)(.*)
RewriteCond %HTTPS (on)|.*
RewriteRule (.*) http(?2s:)\://www.$1$3 [I,RP]


Наконец (почти готово!), Это не оставляет поддоменов в покое. Из-за (. *) Вместо «example.com» он будет перезаписывать abc.example.com/whatever... в www.abc.example.com/whatever.... Таким образом, если у вас есть субдомены, которые нужно оставить в покое, например, staging или localhost для разработчиков, или скажите «shop» для размещенного торгового домена, вы можете «или» сделать это с помощью «www» (обратите внимание, что localhost не имеет конечной точки, обрабатывать просто //localhost).

RewriteCond Host: (?!www\.|staging\.|shop\.|localhost)(.*)
RewriteCond %HTTPS (on)|.*
RewriteRule (.*) http(?2s:)\://www.$1$3 [I,RP]
...