为什么Apache的RewriteRule会显示本地path?

我试图在相对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。