2009-08-01 99 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