2016-01-06 108 views
0

我希望我错过了一些愚蠢的东西。为什么前导斜杠不符合我的RewriteRule?

我试图在OpenShift的免费托管服务上使用PHP 5.4盒式磁带在Apache 2.2上使用.htaccess重定向URL。

这个URI /永久/ A123(注意该规则的过滤模式缺乏龙头斜线)匹配:

RewriteEngine On 
RewriteRule permalink/a.*$ /permalink/b [R=301,L] 

这不符合URI /永久/ A123(注意在领先的斜杠规则的过滤模式):

RewriteEngine On 
RewriteRule /permalink/a.*$ /permalink/b [R=301,L] 

那么,我有什么愚蠢的东西有错?

谢谢。

+0

我检查过了:^ permalink/a。* $ matches,但^/permalink/a。* $不匹配。难道OpenShift的PHP 5.4盒式磁带在我身上剥去了大量的斜线,而不是告诉我吗?我还没有找到任何配置文件,包括任何这样的指令,但也许我不知道在哪里看。 –

+2

隐含起始斜线。如果你想改变它,你可以使用'RewriteBase /'来改变规则适用的基本位置。 – Jon

+0

使用/permalink/(.*)$ – devpro

回答

3

通过删除前导/,用于匹配RewriteRule中的模式的URI在每个目录上下文中进行规范化(无论是在htaccess文件还是在<Directory>容器中)。因此,如果请求的URL是:

http://example.com/web/permalink/123 

并从文档根目录的htaccess文件中,该URI用于匹配规则是web/permalink/123。但在web文件夹中的htaccess文件中,URI是permalink/123

因此,你不能有你的格局开始与/,因为他们从URI在htaccess文件的情况下剥离。

+0

这一切都是有道理的,但它并不能解释为什么我在文档根目录中有另一个与前导斜杠匹配模式的.htaccess。 我现在看到了其他地方提到的一个区别:RewriteBase /。我在文档根目录中的.htaccess文件中使用了与前导斜杠相匹配的URI。我认为这是我错过的重要信息。 这就是说,我想我明白为什么我不应该在这些URI模式中使用前导斜杠。 –

+1

@ J.B.Rainsberger“RewriteBase”指令不影响重写规则的* pattern *中的前导斜杠,它影响规则的目标(它将基础追加到相对目标)。差别可能是'RewriteRule/foo'与'RewriteRule ^/foo'。第一个匹配URI中的任何**'/ foo',第二个匹配'^'并且只匹配URI的开头,并且会失败,因为开头没有'/'。 –

+0

晶莹剔透。谢谢。我想我终于明白了。 –

相关问题