之间的语法区别是什么
RewriteRule help help.php?q=noslash [L] #1
RewriteRule /help help.php?q=withslash [L] #2
如果我点击http://localhost/help,它会转到#1,如果我点击http://localhost//help它仍会转到#1。
我是否正确地说,RewriteRule的第一个参数中的主要斜线基本上被忽略了?
另外,为什么这个重写规则不起作用?
RewriteRule help /help.php [L] #1
在第二个arg前面加上一个前导斜杠实际上会为服务器创建一个500错误。为什么呢?
我应该注意到我正在使用.htaccess文件在
中编写这些规则答案 0 :(得分:12)
奇怪的是,
RewriteRule ^/help help.php?q=2 [L]
上述规则失败且永不匹配。
这条规则:
RewriteRule ^help help.php?q=1 [L]
匹配http://localhost/help,http://localhost//help和http://localhost///help
似乎RewriteRule 从不看到路径的前导斜杠,并且正如TheCoolah所说they are collapsed(无论如何使用.htaccess文件时为0 ..)无论有多少。
对于问题的第二部分,
RewriteRule ^help /help.php
我从Definitive Guide to Apache Mod_rewrite
得到答案...一个不以http://或其他协议开头的重写目标 假定指示符是文件系统路径。不以斜杠开头的文件路径被解释为相对于正在进行重写的目录。
所以/help.php在系统的根目录中查找一个名为help.php的文件,该文件在我的系统上找不到。
要使/help.php显示为相对URL(相对于站点的根目录),您可以使用[PT]指令:
RewriteRule ^/help /help.php [PT]
答案 1 :(得分:4)
关于双斜线:大多数Web服务器在请求处理管道的早期以静默方式将多个斜杠折叠为单个斜杠。至少Apache,Tomcat和Jetty都是如此。大多数基于Unix的文件系统都以相同的方式工作。如果你真的想检查一下,你需要做类似的事情:
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
答案 2 :(得分:1)
help
在路径中的任何位置匹配“帮助”。
/help
匹配任何内容,因为rewriterule
指令省略了用于匹配目的的前导斜杠(即,您必须使用^
,而不是/
或^/
,引用当前目录)。
(如果您在%{REQUEST_URI}
中使用rewritecond
,可能会非常困惑,因为%{REQUEST_URI}
以尾部斜杠开头。\ n \ n匹配{{ 1}},%{REQUEST_URI}
和^
是等效的,目录名称前面总是以斜杠字符开头,无论它是否在顶级目录中。)
服务器错误是由无限循环引起的。 “help”变为“/help.php”,然后由执行重写的相同指令匹配。因此,在第一次匹配之后,“/ help.php”无限地变为“/help.php”,从而导致无法解析的URL。
我相信这样的循环可以用^/
标志(即end
)来修复,但是该标志需要Apache 2.3.9+,而Apache 2.2似乎在部署中更常见。无论如何,修复正则表达式可能会更好; [end]
似乎是更好的选择。
答案 3 :(得分:0)
RewriteRule的工作方式是,如果给定的正则表达式匹配URL的路径部分的任何部分(主机和端口之后但在查询字符串之前的部分),那么整个路径部分将完全替换为给定的代换。这解释了您在问题的第一部分中看到的行为。
我不确定第二部分可能导致500错误的原因;也许在重写引擎运行后不会发生双斜杠的折叠,然后生成服务器错误。
答案 4 :(得分:-1)
500错误的原因是不定式循环:
如果规则重写有助于帮助,那么Apache足够聪明,可以在此时中止重写。