url 中的“./”。做什么的?

"./" in the url. What for?

我目前正在学习.htaccess文件中的正则表达式和正则表达式的应用。 在其中一个视频中我看到了这种代码:

RewriteRule ^(.*)$ ./index.php/ [L]

所以我想知道 ./index.php 之前到底在做什么? 我尝试在 URL 中输入 ./ 并且成功了:

http://localhost/CodeIgniter3Test/./index.php/welcome

被自动重定向到

http://localhost/CodeIgniter3Test/index.php/welcome

所以我的问题是这个重定向引擎在哪里执行(这个规则写在 httpd 或其他地方的文件)以及为什么 ./ 可能被添加到模式 SubstitutionRewriteRule?

./ 字符在很多系统中表示“从当前目录”,就是这个意思,查看执行此文件的当前目录中的文件。

您也可以用两个点而不是一个点 (../) 来表示“来自上面的一个目录”

正如@Sebastian 在他的回答中已经指出的那样, 文件系统路径 中的.(点)指的是当前 工作 目录 (CWD)。但是,在 Apache mod_rewrite 的上下文中,./ 前缀可以说是一个错误,应该被删除。 “当前目录”由 directory-prefix*1 决定——与此无关带点。

但是,除非您将指令链接在一起,否则 ./index.php/index.php/ 相同,并且 ./ 无论如何都会被解析掉(或者由重写引擎在请求映射到文件系统,或者在外部重定向的情况下由浏览器映射。

RewriteRule 替换 字符串以 ./ 为前缀时,mod_rewrite 只是将其视为“相对”路径(任何字符串不以协议或斜杠开头的被认为是“相对的”)。在这种情况下,mod_rewrite 无论如何都会附加 目录前缀

例如,在位于文档根目录的 .htaccess 文件中给出以下指令(例如 /var/www/example/public_html

RewriteRule ^(.*)$ ./index.php/ [L]

如果你请求 /foo 那么上面的指令将请求重写为 ./index.php/foo,之后(在这个处理阶段结束时)目录前缀被添加回成为 /var/www/example/public_html/./index.php/foo.

Apache 然后在请求映射到文件系统时解析掉 ./,因此它变成 /var/www/example/public_html/index.php/foo

因此,原始 替换 字符串上的 ./ 前缀在这里没有任何作用。

what reason could possibly ./ be added to the Pattern Substitution in RewriteRule?

回答你原来的问题.... none。

I tried to type "./" in url and it worked

浏览器实际上在发出 HTTP 请求之前将其删除 - ./ 部分不会作为 HTTP 请求的一部分发送并且永远不会到达您的服务器。

were redirected automatically

这里没有实际的“重定向”——浏览器只是“修复”(即解析)浏览器地址栏中的 URL。


*1 directory_prefix 是其中的绝对文件系统路径.htaccess 文件位于。但是,这可以通过使用 RewriteBase 指令设置 URL-path 来覆盖。请注意,目录前缀总是 以斜线 .

结尾

另请参阅:

  • What does a dot mean in a URL path?