.htaccess 重写规则 if/else

.htaccess 重写规则 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.comindex.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]

但这是正确的方法吗或者还有其他更好的方法吗?

答案1

您要实现的目标可以通过这两种方式实现,并且您当前工作的配置是实现此目的的传统方式。这就是为什么有很多使用 实现此目的的示例RewriteCond表达式和指令IfElseIfElse并且引入在 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>

相关内容