rewriteengine on
rewriterule ^/a/b$ ^/c$
不工作,但
rewriteengine on
rewritebase /
rewriterule ^a/b$ ^c$
作品。
答案 0 :(得分:11)
可能不是RewriteBase使得规则像领先的斜杠一样工作。此外,RewriteRule的第二个参数不是正则表达式。相反,尝试:
RewriteRule ^/?a/b$ c
从.htaccess应用RewriteRule时,将从URL中删除前导斜杠,如果包含该模式,将导致模式失败。通过使用“^ /?”启动模式,它将在主配置文件和每个目录的配置文件中工作。
阅读detailed mod_rewrite documentation,了解重写引擎的工作原理以及RewriteBase的重要性。
编辑: 正如mod_rewrite technical details中所述并在RewriteRule和RewriteBase的文档中所述,在评估每个目录重写规则时,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]