Назад | Перейти на главную страницу

Apache mod_rewrite переменные имена хостов с одним перенаправлением?

У меня есть тестовый сервер (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), поскольку в противном случае требуются исключения, и если вы добавите в свой набор правил в будущем - все легко сломается.

Перенаправить example.notcom на www.example.com

Есть много примеров для этого, в данном конкретном случае:

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.notcom на 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

Перенаправить webtest.example.notcom на webtest.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]