为什么两个模式(/.*)和(。*)匹配不同的string?

两个模式(/.*)(.*)匹配相同的string吗? 我真正的问题是:“abc”去哪了? 东西似乎在mod_rewrite引擎内发生

www/dir/给出这个.htaccess文件:

 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 /] addpath信息后缀: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 /] strip每个目录的前缀: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 /] pattern'(/.*)$'to 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 /] rewrite '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)split 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 /] add每个目录的前缀: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 /] strip 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 /] internal使用/dir/print_url_args.phpredirect[INTERNAL REDIRECT]
 (3)[perdir C:/ db / www / 127.0.0.1  -  [15 / Feb / 2011:14:21:51 +0900] [localhost / sid#1333140] [rid#43833c8 / initial / redir#1] dir /] strip per-dir prefix:C:/db/www/dir/print_url_args.php  - > print_url_args.php
 (3)[perdir C:/ db / www / 127.0.0.1  -  [15 / Feb / 2011:14:21:51 +0900] [localhost / sid#1333140] [rid#43833c8 / initial / redir#1] dir /]将模式'(/.*)$'应用于uri'print_url_args.php'
 (1)[perdir C:/ db / www / 127.0.0.1  -  [15 / Feb / 2011:14:21:51 +0900] [localhost / sid#1333140] [rid#43833c8 / initial / redir# 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 /] addpath信息后缀: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 /] strip每个目录的前缀: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 /] pattern'(。*)$'to 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 /] rewrite '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)split 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 /] add每个目录前缀: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 /] strip 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 /] internal使用/dir/print_url_args.phpredirect[INTERNAL REDIRECT]
 (3)[perdir C:/ db / www / 127.0.0.1  - dir /] strip per-dir prefix:C:/db/www/dir/print_url_args.php  - > print_url_args.php
 (3)[perdir C:/ db / www / 127.0.0.1  - dir /]将模式'(。*)$'应用于uri'print_url_args.php'
 (2)[perdir C:/ db / www / 127.0.0.1  - dir /] rewrite'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)split uri = print_url_args.php?result = print_url_args.php  - > uri = print_url_args.php,args = result = print_url_args.php
 (3)[perdir C:/ db / www / 127.0.0.1  - dir /]添加每个目录的前缀:print_url_args.php  - > C:/db/www/dir/print_url_args.php
 (1)[perdir C:/ db / www / 127.0.0.1  -  [15 / Feb / 2011:14:24:54 +0900] [localhost / sid#1333140] [rid#23fda10 / initial / redir#1] dir /]初始URL同等重写URL:C:/db/www/dir/print_url_args.php [IGNORING REWRITE]

当您在.htaccess上下文(/.*)将永远不匹配完整的URL,从文档 :

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

按目录重写

删除的前缀总是以斜线结尾,意味着匹配发生在从不具有前导斜杠的string上。 因此,在每个目录上下文中带有^ /的模式永远不匹配。

你的问题帮助我解决了一个非常类似的问题!

我无法在我的托pipe环境(godaddy)中重写日志,所以我完全被“日志”中的“第二次”重写所困惑。 从那里开始,不难理解,做这项工作的关键是必须以某种方式停止recursion重写。

这里有一个很好的解决scheme(通过serverfault用户Dave Drager对类似问题的回答 )。

尝试这个:

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