RewriteEngine对所有重写都是强制性的吗?

时间:2013-02-18 23:34:45

标签: .htaccess mod-rewrite

我只是想知道是否有必要在每次添加重写时包含RewriteEngine On和Rewrite Base?例如,我想同时使用“从URL删除QUERY_STRING”和“在一天中的某些时段阻止访问文件^”(引自askapache.com的示例)

从网址

中删除QUERY_STRING
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} .
RewriteRule ^login.php /login.php? [L]

在一天中的某些时段阻止访问文件^

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
# If the hour is 16 (4 PM) Then deny all access
RewriteCond %{TIME_HOUR} ^16$
RewriteRule ^.*$ - [F,L]

我可以将它们组合成以下内容吗?

Options +FollowSymLinks
RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} .
RewriteRule ^login.php /login.php? [L]
# If the hour is 16 (4 PM) Then deny all access
RewriteCond %{TIME_HOUR} ^16$
RewriteRule ^.*$ - [F,L]

提前感谢您的时间。

2 个答案:

答案 0 :(得分:4)

是的,RewriteEngineRewriteBase只需指定一次。

答案 1 :(得分:1)

在每个具有重写规则的htaccess文件中都需要RewriteEngine On,但只需要一次。{p>否则规则将被忽略。

对于RewriteBase,如果您将相对URI作为目标,或者您希望规则是可移植的,则只需要更改基数(如果您将规则从一个目录移动到另一个)。例如:

这些规则不需要RewriteBase

RewriteRule ^login.php /login.php? [L]

RewriteRule ^.*$ - [F,L]

由于/login.php不是相对URI,因此您可以理解为您实际上是指http://domain.com/login.php-只是意味着传递,因此无论如何都会忽略基数。

您可能希望使用RewriteBase的实例:

RewriteRule ^dir/(.*)$ dir2/$1 [L,R=301]

如果没有RewriteBase / apache,可能会错误地猜测dir2/$1是文件路径还是URI路径,并将您重定向到错误的位置。使用RewriteBase /,它会正确重定向。