Apache重写规则导致斜杠

bob*_*obo 6 apache mod-rewrite

领先的斜线第一个论点:被忽略了?

什么是语法区别

RewriteRule help help.php?q=noslash [L]     #1
RewriteRule /help help.php?q=withslash [L]  #2
Run Code Online (Sandbox Code Playgroud)

如果我点击http:// localhost/help,它会转到#1,如果我点击http:// localhost //帮助它仍然会转到#1.

我是否正确地说在RewriteRule的第一个参数中的主要斜线基本上被忽略了?

领先斜线第二个论点:错误?

另外,为什么这个重写规则不起作用?

RewriteRule help /help.php [L]     #1
Run Code Online (Sandbox Code Playgroud)

在第二个arg前面放置一个前导斜杠实际上会为服务器创建一个500错误.为什么?

我应该注意到我正在使用.htaccess文件来编写这些规则

bob*_*obo 13

很奇怪的是,

RewriteRule   ^/help    help.php?q=2              [L]
Run Code Online (Sandbox Code Playgroud)

上述规则失败,永不匹配.

这条规则:

RewriteRule   ^help      help.php?q=1             [L]
Run Code Online (Sandbox Code Playgroud)

匹配http:// localhost/help,http:// localhost // helphttp:// localhost /// help

似乎RewriteRule 永远不会看到路径的前导斜杠,并且正如TheCoolah说它们已经崩溃(无论如何使用.htaccess文件时为0 ..)无论有多少.

对于问题的第二部分,

RewriteRule   ^help    /help.php
Run Code Online (Sandbox Code Playgroud)

我从Apache Mod_rewrite的权威指南中得到了答案

...不以http://或其他协议指示符开头的重写目标被假定为文件系统路径.不以斜杠开头的文件路径被解释为相对于正在进行重写的目录.

所以/help.php在系统的根目录中查找名为help.php的文件,该文件在我的系统上找不到.

要使/help.php显示为相对URL(相对于站点的根目录),您可以使用[PT]指令:

RewriteRule   ^/help    /help.php    [PT]
Run Code Online (Sandbox Code Playgroud)

这会将http:// localhost/help 指向http://localhost/help.php.

  • 如果将规则放在vhost配置中,而不是在目录上下文中,则看起来前导斜杠确实匹配. (3认同)