2009-08-01 88 views
4

假设我们有下面的PHP页面 “的index.php”:Apache的mod_rewrite和%{REQUEST_URI}问题

<? 
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”中是否有任何变量可以在重定向后告诉我原始请求?

在此先感谢,希望我已经说清楚了。这是我在这里的第一篇文章:)

回答

1

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

+0

为什么不简单使用`$ _SERVER ['REQUEST_URI']`? – Gumbo 2009-08-03 12:53:52

4

我不确定它是否会满足您的需求,但先试着看REDIRECT_REQUEST_URI,那么如果它不在那里,REQUEST_URI。你在Gumbo的回答中提到你真正想要的是原始的URI; REDIRECT_*服务器变量的版本是Apache如何尝试使这种事情可用。

+0

不幸的是,添加[PT]修饰符没有任何区别。 – liviucmg 2009-08-03 10:07:25

2

只需更改规则的顺序和它的作品:

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

或者只使用一个规则:

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

是的,我猜这适用于我发布的示例,尽管我宁愿寻找一个变量,即使在一次或多次重定向后也能告诉我原始请求。 – liviucmg 2009-08-03 10:12:50