我的RewriteRule通过.htaccess出了什么问题? (为什么需要RewriteBase?)

时间:2010-01-26 04:13:11

标签: apache .htaccess mod-rewrite

rewriteengine on
rewriterule ^/a/b$ ^/c$

不工作,但

rewriteengine on
rewritebase /
rewriterule ^a/b$ ^c$

作品。

2 个答案:

答案 0 :(得分:11)

可能不是RewriteBase使得规则像领先的斜杠一样工作。此外,RewriteRule的第二个参数不是正则表达式。相反,尝试:

RewriteRule ^/?a/b$ c

从.htaccess应用RewriteRule时,将从URL中删除前导斜杠,如果包含该模式,将导致模式失败。通过使用“^ /?”启动模式,它将在主配置文件和每个目录的配置文件中工作。

阅读detailed mod_rewrite documentation,了解重写引擎的工作原理以及RewriteBase的重要性。

编辑: 正如mod_rewrite technical details中所述并在RewriteRuleRewriteBase的文档中所述,在评估每个目录重写规则时,URL已被转换为路径。重写引擎不再具有可以使用的URL。相反,它会删除本地目录前缀(包含.htaccess文件的目录),该前缀以斜杠结尾。例如,假设访问者请求“/var/www/foo/bar/baz.html”并且在“/var/www/foo/.htaccess”中设置了重写规则。在每个规则之前,重写引擎将删除“/ var / www / foo /”,使“bar / baz.html”与重写规则匹配。处理规则后,将预先添加本地目录前缀(除非替换以“http://”开头)。在处理完所有重写规则之后,重写基础(如果设置)将替换本地目录前缀;如果没有,则剥离文档根。然后将重写的URL重新注入为子请求。

答案 1 :(得分:1)

您使用的是哪个版本的Apache?从根目录重写时,不需要RewriteBase。如果你不是,你可能需要它。例如,我的一个博客的当前配置(Apache 2.2)的一部分如下所示,并且有效:

RewriteEngine On    
RewriteRule ^/$ /blog/ [R]
RewriteRule ^/wordpress/(.*) /blog/$1 [R]