我刚刚安装了全新的 Apache (Apache/2.4.7 - Ubuntu),创建并启用了一个文档根目录为 的站点/var/www/html
。启用 mod_rewrite 后,我继续在该目录中创建一个简单的 .htaccess 文件。然后我添加了标准:
Options +FollowSymlinks
RewriteEngine on
然后我开始创建重写规则。由于 .htaccess 通常不太友好,我通常通过首先将结果作为参数发送到临时 php 文件来创建重定向,该文件只会转储 $_GET,以便我可以看到正在发生的事情。所以我的重写规则从基本开始:
RewriteRule ^(.*)$ test.php?name=$1
我的测试要求是:/test/path.html
预期结果:[name] => test/path.html
实际结果:[name] => test.php
什么鬼?
好像 301 重定向已经以某种方式发生了。我似乎无法获取实际的请求路径。此外,当检查应该具有路径(如 )的服务器变量时%{PATH_INFO}
,%{ORIG_PATH_INFO}
它们会返回空值并%{REQUEST_URI}
返回/test.php
。
我尝试过将其添加AcceptPathInfo On
到 .htaccess 中,但没有任何效果。我也尝试过添加,RewriteBase /
但这也没有效果。此外,将重写规则移至我的.conf
文件后,我得到了相同的结果。
知道这里可能发生什么事吗?
答案1
重写规则“忽略.htaccess
”所有前面的路径元素:
在目录和 htaccess 上下文中,模式最初将与文件系统路径进行匹配,在删除引导服务器到当前 RewriteRule 的前缀之后(例如“app1/index.html”或“index.html”,具体取决于指令的定义位置)。
所以你可能想添加
RewriteBase /test
到你的.htaccess
。如果你想绕过它 - 在 Vhost/httpd.conf 级别配置重写。
刚刚使用以下配置进行了测试
# cat .htaccess
RewriteEngine on
RewriteBase /~dimon
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(rw.*)$ test.php?name=$1
# cat test.php
<? echo "Name:",$_GET["name"];
phpinfo();
?>
并根据要求http://myserver.com/~dimon/rwfoo, 得到:
Name:rwfoo
....
REDIRECT_SCRIPT_URL /~dimon/rwfoo
REDIRECT_SCRIPT_URI http://myserver.com/~dimon/rwfoo
SCRIPT_URL /~dimon/rwfoo
SCRIPT_URI http://myserver.com/~dimon/rwfoo
REQUEST_URI /~dimon/rwfoo
SCRIPT_NAME /~dimon/test.php