我有以下.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
。表达式和指令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>