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

.htaccess rewriterule if / else

У меня есть следующий код .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файл index.php должен иметь параметры pages = helpdesk и file = index. Когда я иду в http://account.domain.com файл index.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>