Apache的mod_rewrite和%{REQUEST_URI}问题

时间:2009-08-01 20:25:01

标签: php apache mod-rewrite request

假设我们有以下PHP页面“index.php”:

<?
if (!isset($_GET['req'])) $_GET['req'] = "null";
echo $_SERVER['REQUEST_URI'] . "<br>" . $_GET['req'];
?>

以及以下“.htaccess”文件:

RewriteRule ^2.php$ index.php?req=%{REQUEST_URI}
RewriteRule ^1.php$ 2.php

现在,让我们访问“index.php”。我们得到了这个:

/index.php
null

那很酷。让我们访问“2.php”。我们得到了这个:

/2.php
/2.php

那也很酷。但现在让我们来看看“1.php”:

/1.php
/2.php

所以...我们要求“1.php”,它默默地重定向到“2.php”,它默默地重定向到“index.php?req =%{REQUEST_URI}”,但这里是“%{REQUEST_URI} “似乎是”2.php“(我们正在寻找第一次重定向后的页面)和$ _SERVER ['REQUEST_URI']是”1.php“(原始请求)。

这些变量不应该相等吗?今天这给我带来了很多麻烦,因为我试图仅根据原始请求进行重定向。我可以在“.htaccess”中使用哪个变量,即使重定向后也会告诉我原始请求吗?

提前致谢,我希望我已经说清楚了。这是我的第一篇帖子:)

3 个答案:

答案 0 :(得分:4)

我不确定它是否能满足您的需求,但请先尝试REDIRECT_REQUEST_URI,然后再查看REQUEST_URIREDIRECT_*。你在评论中提到了Gumbo的答案,你真正想要的是原始的URI; {{1}}版本的服务器变量是Apache尝试使这类东西可用的方式。

答案 1 :(得分:2)

只需更改规则的顺序即可:

RewriteRule ^1\.php$ 2.php
RewriteRule ^2\.php$ index.php?req=%{REQUEST_URI}

或只使用一条规则:

RewriteRule ^(1|2)\.php$ index.php?req=%{REQUEST_URI}

答案 2 :(得分:1)

嗯,我想我解决了这个问题。我使用%{THE_REQUEST}变量,它基本上包含这样的东西:“GET /123.php HTTP / 1.1”。即使重定向后它仍然保持不变。谢谢大家的帮助! :)