У меня есть следующий код .htaccess:
RewriteEngine on
<if "%{HTTP_HOST} =~ /^helpdesk\./">
RewriteRule ^/?$ /index.php?pages=helpdesk&file=index [NC,L,QSA]
</if>
<if "%{HTTP_HOST} =~ /^account\./">
RewriteRule ^/?$ /index.php?pages=account&file=index [NC,L,QSA]
</if>
Очевидно, что это не работает.
Чего я хочу достичь:
когда я иду к http://helpdesk.domain.com, индекс.php файл должен получить параметры pages=helpdesk и file=index. Когда я перехожу в http://account.domain.com индекс.php файл должен получить параметры pages=account и file=index.
Когда я заменяю RewriteRule редиректом, он работает, но возможно ли этого достичь?
Заранее спасибо!
Правка:
задал свой вопрос способ поститься. Это работает.
RewriteEngine on
RewriteCond %{HTTP_HOST} ^helpdesk\..* [NC]
RewriteRule ^/?$ /index.php?pages=helpdesk&file=index [NC,L,QSA]
RewriteCond %{HTTP_HOST} ^account\..* [NC]
RewriteRule ^/?$ /index.php?pages=account&file=index [NC,L,QSA]
Но является ли это правильным способом или есть (лучшая) альтернатива?
То, что вы пытаетесь достичь, возможно с обоими, и ваша текущая рабочая конфигурация является традиционным способом сделать это. Вот почему есть множество примеров того, как это сделать с RewriteCond
. Выражения и директивы If
, ElseIf
, Else
и были введены в Apache 2.4 в качестве долгожданных функция, и один из первых примеров - сделать перезапись более читаемой и предсказуемой:
Некоторые из вещей, для которых вы могли бы использовать эту директиву, вы использовали mod_rewrite до сих пор, так что один из побочных эффектов этого директива заключается в том, что мы можем уменьшить нашу зависимость от комплекса mod_rewrite синтаксис для общих ситуаций. В ближайшие месяцы еще примеры будет добавлен в документацию, и у нас будет раздел рецептов со многими из тех же сценариев, что и в mod_rewrite раздел рецептов.
Фактически, большинство наиболее распространенных применений mod_rewrite теперь можно заменить с директивой
If
, что упрощает чтение и, следовательно, менее подвержен ошибкам, а петля переадресации, которая так часто мешает Решения на основеRewriteRule
.
Без тестирования я бы сказал, что использование регулярных выражений в вашем варианте использования делает это слишком сложным. Поскольку вы сравниваете заголовки Host:
, вероятно, в фиксированном домене, скажем example.com
, вы можете использовать простое сравнение ==
(равенство строк) оператор вместо = ~
(строка соответствует регулярному выражению):
<ifModule mod_rewrite.c>
RewriteEngine on
<If "%{HTTP_HOST} == 'helpdesk.example.com'">
RewriteRule ^/?$ /index.php?pages=helpdesk&file=index [NC,L,QSA]
</If>
<If "%{HTTP_HOST} == 'account.example.com'">
RewriteRule ^/?$ /index.php?pages=account&file=index [NC,L,QSA]
</If>
</ifModule>