У меня есть тестовый сервер (webtest.example.com) и рабочий сервер (www.example.com).
У меня также есть example.org, example.net и т. Д. Я хочу, чтобы они перенаправляли на example.com. Я также хочу, чтобы любые записи, не относящиеся к www, перенаправлялись на www.
По сути, я просто хочу знать, есть ли более эффективный (то есть с меньшим количеством строк) способ справиться с этим?
RewriteCond %{HTTP_HOST} !^www\.example\.com$
RewriteCond %{HTTP_HOST} !^webtest\.example
RewriteRule ^(.*)$ http://www.example.com%{REQUEST_URI} [L,R=301]
RewriteCond %{HTTP_HOST} !^webtest\.example\.com$
RewriteCond %{HTTP_HOST} ^webtest\.example
RewriteRule ^(.*)$ http://webtest.example.com%{REQUEST_URI} [L,R=301]
.. кажется, может быть, есть способ объединить 2 блока в один блок ..
Начните с правил, которые делают то, что вы хотите, а затем объедините их. В вопросе у вас есть 3 требования и правила, которые охватывают только два из них - отсутствует одно правило.
Ключевой совет - писать правила, которые используют положительное совпадение (начинается с foo), а не отрицательное совпадение (начинается с чего угодно, кроме foo), поскольку в противном случае требуются исключения, и если вы добавите в свой набор правил в будущем - все легко сломается.
Есть много примеров для этого, в данном конкретном случае:
RewriteCond %{HTTP_HOST} ^example
RewriteRule ^ http://www.example.com%{REQUEST_URI} [R=301,L]
Неважно, example.com
, example.net
или example.org
- все они начинаются с примера - соответствуют запросам домена без www и перенаправляют на www.example.com
Для этого используйте отрицательный просмотр вперед, чтобы исключить www.example.com
:
RewriteCond %{HTTP_HOST} ^www\.example\.(?!com)$
RewriteRule ^ http://www.example.com%{REQUEST_URI} [L,R=301]
Т.е. соответствует любому хосту, начинающемуся с www.example, который не заканчивается на .com
Точно так же, используя отрицательный просмотр вперед, это можно нормализовать:
# capture the subdomain, and match hosts that don't end with .com
RewriteCond %{HTTP_HOST} ^webtest\.example\.(?!com)
RewriteRule ^ http://webtest.example.com%{REQUEST_URI} [L,R=301]
Т.е. соответствует любому хосту, начинающемуся с webtest.example, который не заканчивается на .com
В поддомене могут быть:
RewriteCond %{HTTP_HOST} ^(www|webtest)\.example\.(?!com)
RewriteRule ^ http://%1.example.com%{REQUEST_URI} [L,R=301]
Однако первый не может быть легко включен здесь (по крайней мере, я не могу придумать тривиального способа сделать это).
Таким образом, конечный результат:
# Redirect no-www requests to www.example.com
RewriteCond %{HTTP_HOST} ^example
RewriteRule ^ http://www.example.com%{REQUEST_URI} [R=301,L]
# Redirect requests on the wrong tld to .com
RewriteCond %{HTTP_HOST} ^(www|webtest)\.example\.(?!com)
RewriteRule ^ http://%1.example.com%{REQUEST_URI} [L,R=301]