Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache 无重写基时的mod_重写行为_Apache_.htaccess_Mod Rewrite - Fatal编程技术网

Apache 无重写基时的mod_重写行为

Apache 无重写基时的mod_重写行为,apache,.htaccess,mod-rewrite,Apache,.htaccess,Mod Rewrite,我只是想确认一下。从我收集的mod_rewrite的工作原理来看,Apache收到一个URL,mod_rewrite立即在httpd.conf中应用(非)规则,然后每个目录mod rewrite开始工作,如果有任何更改,则使用新的URL重新启动该过程。 @JonLin对first的最佳回答是,当您的每目录规则指定了一个绝对替换(即以斜杠开始)时,它被假定为相对于我得到的DocumentRoot。但对于相对替换(无斜杠),Jon接着说: 它基于规则所在的目录。所以如果 重写规则^foo$bar.p

我只是想确认一下。从我收集的mod_rewrite的工作原理来看,Apache收到一个URL,mod_rewrite立即在httpd.conf中应用(非)规则,然后每个目录mod rewrite开始工作,如果有任何更改,则使用新的URL重新启动该过程。 @JonLin对first的最佳回答是,当您的每目录规则指定了一个绝对替换(即以斜杠开始)时,它被假定为相对于我得到的DocumentRoot。但对于相对替换(无斜杠),Jon接着说:

它基于规则所在的目录。所以如果

重写规则^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。但是,为了确认,即使在Jon提到的前一个例子中,也不是实际的重定向,替换的字符串确实会被发送回Apache的URL接收代码,重新启动整个过程,对吗?上的图表似乎暗示,除非没有规则进行更改,否则流程将继续重新启动。在这些非重定向情况下,将文件路径从文件系统根目录直接定位到htaccess目录,并将其定位到替换的开始位置似乎是有意义的。但是,如何按照URL接收代码的预期将其转换为正确的URL?是否已预先设置?我认为这将使所有内容都与documentroot相关,而不是实际的文件系统根


谢谢

我一直在读更多的书,我想我已经为所有感兴趣的人解释了这一点。 关于如何将文件系统绝对路径转换为内部重定向的有效url的问题,我认为HTTP请求中的URI包含“http://hostname,但这已被切断,即URI类似于/this/is/a/path。主机名位于单独的“主机”标题字段中,并且在mod_rewrite运行时不再是重要信息,因为Apache的初始阶段已经注意到端口上的GET请求,如果使用基于名称的虚拟主机,则从主机标题字段解释DocumentRoot之类的内容,最后调用mod_rewrite执行的位置。所以任何时候mod_rewrite运行时,都可能只有一个主机名让我们来到这里

总之,我所说的Apache的“URL接收”部分总是处理/path/like/this/without/hostname,而不仅仅是在内部重定向之后。规范确实说rewriteCond/rewriteRule与这些路径匹配,但我认为主机名最初就在那里,所以被删除了。因此,剩下的就是要确保我们的规则已经准备好了,以应对它们运行在由它们自己的早期运行产生的内部重定向中的情况,并且当它们看到由不是以斜杠开头的替换导致的文件系统绝对路径时,不会无意中执行某些操作。多丰盛的食物啊