【发布时间】:2016-01-08 18:16:17
【问题描述】:
只是想确认一下。根据我收集到的 mod_rewrite 工作原理,Apache 收到一个 URL 并立即 mod_rewrite 在 httpd.conf 中应用(非
它基于规则所在的目录。所以如果
重写规则 ^foo$ bar.php [L]
在“根目录”中,您访问 http://example.com/foo,您将获得 http://example.com/bar.php 服务。但是,如果该规则位于“subdir1”目录中,并且您访问 http://example.com/subdir1/foo,您将获得 http://example.com/subdir1/bar.php。等等。这有时有效,有时无效,正如文档所说,它应该是相对路径所必需的,但大多数时候它似乎有效。除非您正在重定向(使用 R 标志,或者因为您的规则目标中有 http://host 而隐含地)。这意味着这条规则:
重写规则 ^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。但只是为了确认,即使在乔恩提到的前一种情况下,即。不是实际的重定向,替换的字符串确实会被发送回 Apache 的 URL 接收代码,重新启动整个过程,对吗? this page of the spec 上的图表似乎暗示,在没有规则进行更改之前,该过程会不断重新启动。这些非重定向情况似乎是将文件路径从文件系统根目录直接添加到 htaccess 目录到替换开头的时间。但是,如何将其转换为 URL 接收代码所期望的正确 URL - http://localhost 是否被前置?我认为这会使所有内容都与文档根目录相关,而不是实际的文件系统根目录。
谢谢!
【问题讨论】:
标签: apache .htaccess mod-rewrite