我试图在相对path的.htaccess
使用RewriteRules,但是当我尝试输出相对path时,Apache似乎想要输出物理path而不是服务器path。 绝对和服务器根path工作正常。 例如:
RewriteEngine On # this works fine, 127.0.0.1/ab redirects to 127.0.0.1/cd RewriteRule ^ab$ /cd [R] # this doesn't work... 127.0.0.1/wx redirects to 127.0.0.1/C:/path/to/files/yz RewriteRule ^wx$ yz [R]
添加一个“ RewriteBase /
”可以解决这个问题,但是将path添加到每个.htaccess
是很繁琐的,而且更改目录结构变得更加困难。 RewriteBase默认为当前的物理path而不是当前的URIpath吗?
对于那些碰巧从Google(如我)来到这里的人,简短的清单:
确保你有RewriteBase /
(或任何其他值 – 声明是重要的)
如果你使用重定向( [R]
, [R=30x]
等) – 确保新的URI以/
开始,并包含一个相对于你的域根的路径
(如果上面没有帮助)重启Apache,清除浏览器的缓存(特别是在某些时候你已经使用了[R=301]
)
这就是拯救我的一天,也许也会拯救你的。
这是因为[R],这意味着服务器将重定向到新的路径(所以用户的浏览器将发送一个新的请求与新发送的URI),而不是内部翻译URI到本地路径。
在你的第一个RewriteRule中,新路径中有一个斜线,因此服务器不会尝试将其翻译成本地路径,但是在第二个规则中没有斜线,这就是为什么它重定向到一个完整的本地路径。 这也解释了为什么它与RewriteBase集一起工作。
除去[R](你可以用[L]代替它,这样可以避免服务器在找到匹配的规则时尝试匹配其他规则),或者在第二个RewriteRule中的“yz”之前添加一个斜杠。
我建议简单地用[L]替换[R]:这样,用户将不会看到重写的路径,这通常是RewriteRules打算做的(主要用于SEO目的),除非你特别想要将您的用户重定向到一个新的URL。
试试这个,告诉我结果:
#这不起作用… 127.0.0.1/wx重定向到127.0.0.1/C:/path/to/files/yz
RewriteRule ^ wx $ / yz [R]
把/之前yz。