为什么两个模式 (/.*) 和 (.*) 匹配不同的字符串?

为什么两个模式 (/.*) 和 (.*) 匹配不同的字符串?

这两个模式不应该(/.*)匹配(.*)相同的字符串吗?我真正的问题是:“abc”去哪儿了?mod_rewrite 引擎内部似乎发生了一些奇怪的事情......

鉴于此.htaccess 文件www/dir/

Options +FollowSymlinks
RewriteEngine on
RewriteRule (/.*) print_url_args.php?result=$1

请求http://localhost/dir/abc/123/导致:

  • 结果 ($1) = "/123/"
  • $_REQUEST_URI = “/dir/abc/123/”

如果/从模式中删除RewriteRule (.*) print_url_args.php?result=$1

对 1http://localhost/dir/abc/123/1 执行相同请求的结果为:

  • 结果($1)=“print_url_args.php”
  • $_REQUEST_URI = “/dir/abc/123/”


更新:发布重写日志。

127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (3) [perdir C:/db/www/dir/] 添加路径信息后缀:C:/db/www/dir/abc -> C:/db/www/dir/abc/123/
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (3) [perdir C:/db/www/dir/] 删除每个目录的前缀: C:/db/www/dir/abc/123/ -> abc/123/
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (3) [perdir C:/db/www/dir/] 将模式 '(/.*)$' 应用于 uri 'abc/123/'
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (2) [perdir C:/db/www/dir/] 重写 'abc/123/' -> 'print_url_args.php?result=/123/'
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (3) 拆分 uri=print_url_args.php?result=/123/ -> uri=print_url_args.php, args=result=/123/
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (3) [perdir C:/db/www/dir/] 添加每个目录前缀:print_url_args.php -> C:/db/www/dir/print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (2) [perdir C:/db/www/dir/] 删除 document_root 前缀: C:/db/www/dir/print_url_args.php -> /dir/print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#23cd4a8/initial] (1) [perdir C:/db/www/dir/] 使用 /dir/print_url_args.php 进行内部重定向 [内部重定向]
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#43833c8/initial/redir#1] (3) [perdir C:/db/www/dir/] 删除每个目录的前缀:C:/db/www/dir/print_url_args.php -> print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#43833c8/initial/redir#1] (3) [perdir C:/db/www/dir/] 将模式“(/.*)$”应用于 uri“print_url_args.php”
127.0.0.1 - - [15/Feb/2011:14:21:51 +0900] [localhost/sid#1333140][rid#43833c8/initial/redir#1] (1) [perdir C:/db/www/dir/] 穿过 C:/db/www/dir/print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (3) [perdir C:/db/www/dir/] 添加路径信息后缀:C:/db/www/dir/abc -> C:/db/www/dir/abc/123/
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (3) [perdir C:/db/www/dir/] 删除每个目录的前缀: C:/db/www/dir/abc/123/ -> abc/123/
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (3) [perdir C:/db/www/dir/] 将模式 '(.*)$' 应用于 uri 'abc/123/'
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (2) [perdir C:/db/www/dir/] 重写'abc/123/' -> 'print_url_args.php?result=abc/123/'
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (3) 拆分 uri=print_url_args.php?result=abc/123/ -> uri=print_url_args.php, args=result=abc/123/
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (3) [perdir C:/db/www/dir/] 添加每个目录前缀:print_url_args.php -> C:/db/www/dir/print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (2) [perdir C:/db/www/dir/] 删除 document_root 前缀: C:/db/www/dir/print_url_args.php -> /dir/print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23bf470/initial] (1) [perdir C:/db/www/dir/] 使用 /dir/print_url_args.php 进行内部重定向 [内部重定向]
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23fda10/initial/redir#1] (3) [perdir C:/db/www/dir/] 删除每个目录的前缀:C:/db/www/dir/print_url_args.php -> print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23fda10/initial/redir#1] (3) [perdir C:/db/www/dir/] 将模式“(.*)$”应用于 uri“print_url_args.php”
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23fda10/initial/redir#1] (2) [perdir C:/db/www/dir/] 重写“print_url_args.php”->“print_url_args.php?result=print_url_args.php”
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23fda10/initial/redir#1] (3) 拆分 uri=print_url_args.php?result=print_url_args.php -> uri=print_url_args.php, args=result=print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23fda10/initial/redir#1] (3) [perdir C:/db/www/dir/] 添加每个目录前缀:print_url_args.php -> C:/db/www/dir/print_url_args.php
127.0.0.1 - - [15/Feb/2011:14:24:54 +0900] [localhost/sid#1333140][rid#23fda10/initial/redir#1] (1) [perdir C:/db/www/dir/] 初始 URL 等于重写 URL:C:/db/www/dir/print_url_args.php [忽略重写]

答案1

当你在.htaccess上下文中(/.*)永远不会匹配完整的URL时,来自文档

在目录和 htaccess 上下文中,模式最初将与文件系统路径进行匹配,然后删除引导服务器到当前 RewriteRule 的前缀(例如“app1/index.html”或“index.html”,具体取决于指令的定义位置)。

每个目录重写

...

删除的前缀始终以斜杠结尾,这意味着匹配发生在从未以斜杠开头的字符串上。因此,带有 ^/ 的模式永远不会在每个目录上下文中匹配。

答案2

您的问题帮助我解决了一个非常相似的问题!

我无法访问托管环境 (godaddy) 中的重写日志,因此我对“第二次”重写完全感到困惑,您的日志对此进行了清晰的解释。从那里,不难理解,实现此操作的关键是必须以某种方式停止这些递归重写。

这个问题有一个很好的解决办法这里(来自 serverfault 用户 Dave Drager 的回答回答类似的问题)。

尝试这个:

Options +FollowSymlinks
RewriteEngine on
RewriteCond %{ENV:
REDIRECT_X} =""
RewriteRule (.*) print_url_args.php?result=$1 [E=X:1,L]

相关内容