只想确认一下。从我收集的mod_rewrite如何工作,Apache接收一个URL并立即mod_rewrite在httpd.conf中应用(非< directory>)规则,然后每个目录的模块重写开始工作,然后用新的URL重新启动进程如果有任何改变。 @ JonLin对this question的一个很好的答案首先说当你的每个目录规则规定一个绝对替换(即以斜杠开头)时,它被认为是相对于DocumentRoot我是得到。但是相对替换(没有斜线)乔恩然后说:
它基于规则所在的目录。所以如果
RewriteRule ^ foo $ bar.php [L]
位于" root"然后你去http://example.com/foo,你得到http://example.com/bar.php。但是,如果该规则在" subdir1"目录,然后转到http://example.com/subdir1/foo,您将获得http://example.com/subdir1/bar.php。这有时是有效的,有时也没有,正如文档所说,它应该是相对路径所必需的,但大部分时间似乎都有效。除非您重定向(使用R标志,或隐式,因为您在规则的目标中有http:// host)。这意味着这条规则:
RewriteRule ^ foo $ bar.php [L,R]
如果它在" subdir2"目录,你去http://example.com/subdir2/foo,mod_rewrite会将相对路径误认为文件路径而不是URL路径,因为R标志,你最终会得到重定向到:http://example.com/var/www/localhost/htdocs/subdir1。
正如Jon在最后一点解释的那样,当发生重定向并且没有rewriteBase时,作为文件路径的字符串会附加到站点的基地址以创建虚假URL。但只是为了证实,即使在Jon提到的前一种情况下,即。不是实际的重定向,替换的字符串会被发送回Apache的URL接收代码,重新启动整个过程,对吗? this page of the spec上的图表似乎暗示,在没有规则进行更改之前,该过程会不断重新启动。这些非重定向情况似乎是将文件路径直接从文件系统根目录添加到htaccess目录到替换开头的时候。但是,如何通过URL接收代码将其转换为正确的URL - http://localhost是否会得到前置?我认为这会使所有内容都与文档相关,而不是实际的文件系统根目录。
谢谢!
答案 0 :(得分:0)
正在做更多的阅读,并认为我已经解释了这个,对任何感兴趣的人。 关于我关于如何将文件系统绝对路径转换为内部重定向的有效URL的问题,我认为HTTP请求中的URI包含" http:// hostname",但是这已经被切断了关闭即。 URI就像是/ this / is / a / path。主机名在一个单独的" Host"标题字段,并且在mod_rewrite运行时不再是重要信息,因为Apache的初始Post Read Request阶段已经注意到端口上的GET请求,并且如果基于名称的虚拟主机是在使用中,从Host头字段解释诸如DocumentRoot之类的东西,最后调用mod_rewrite执行的URI Translation Phase。因此,每当mod_rewrite运行时,可能只有一个主机名让我们在这里。
总而言之,我称之为" URL-reception" Apache的一部分总是处理/ paths / like / this / without / hostname,而不仅仅是在内部重定向之后。规范确实说rewriteCond / rewriteRule匹配这些路径,但我认为主机名最初是在那里并被删除。那么剩下的就是确保我们的规则准备好应用于它们在早期自我产生的内部重定向中运行的情况,并且当它们看到由文件系统引起的文件系统绝对路径时不会无意中执行某些操作。没有以斜线开头的替代品。多么满口。