2009-07-22 32 views
15

我想在.htaccess相对路径使用的RewriteRules,但是Apache似乎想输出物理路径,而不是服务器路径每当我试图输出的相对路径。绝对和服务器根路径工作正常。例如:为什么Apache的RewriteRule会显示本地路径?

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 /”解决了这个问题,但它是乏味的路径添加到每个.htaccess,这使得它更难改变的目录结构。是否有原因RewriteBase默认为物理路径而不是当前URI路径?

回答

5

这是因为[R]这意味着服务器将重定向到新的路径(所以用户的浏览器将发出一个新的请求与新发送的URI),而不是内部翻译URI到本地路径。

在你的第一个RewriteRule中,新路径中有一个斜线,因此服务器不会尝试将其转换为本地路径,但在第二条规则中没有斜线,这就是为什么它重定向到一个完整的本地路径。这也解释了为什么它可以与RewriteBase集一起工作。

删除[R](在您的情况下,您可以用[L]替换它,这样可以避免服务器在找到匹配的项时尝试匹配其他规则),或者在“yz”之前添加斜线你的第二个RewriteRule。

我建议简单地用[L]代替[R]:这样,用户将看不到重写的路径,这通常是RewriteRules打算做的(主要用于SEO目的),除非你特别想将你的用户重定向到一个新的URL。

+0

我确实想要一个实际的重定向到新的路径 - 我使用它来创建快捷方式的URL并纠正错别字。有没有办法避免在每个.htaccess文件中手动设置RewriteBase? – zildjohn01 2009-07-22 03:30:22

+0

一般来说,你不需要改变`RewriteBase`。只需使用内部路径和绝对路径的相对路径进行外部重定向。 – Gumbo 2009-07-22 06:43:07

12

对于那些谁碰巧从谷歌(像我)来到这里,在简短的清单:

  • 请确保您有RewriteBase /(或任何其他值 - 该声明是什么是重要的)

  • 如果使用重定向([R][R=30x]等) - 确保新的URI与/开始,包含相对于域根目录的路径

  • (如果上面没有帮助还)重启Apache,清除浏览器的缓存(特别是如果你在某些时候使用[R=301]

这就是救了我的一天,也许它会保存你的了。

0

试试这个,告诉我结果:
#这不工作... 127.0.0.1/wx重定向到127.0.0.1/C:/path/to/files/yz

RewriteRule^wx $/yz [R]

put/before yz。

相关问题