2012-07-28 43 views
1

我有這個安裝在我的htdocs:爲什麼.htaccess表現奇怪?通過腳本名本身,而不是給出GET變量

htdocs 
htdocs/somedir 
htdocs/somedir/process.php 
htdocs/somedir/.htaccess 

這是的.htaccess代碼:

RewriteEngine on 
RewriteRule ^([^/]*)$ process.php?var=$1 [L] 

我相信的是,這個規則告訴apache從最右邊的字母開始,並繼續存儲它,除非遇到/因此,在URL http://127.0.0.1/somedir/foo,$1應該是foo。對?

但是,當我去這個網址:http://127.0.0.1/somedir/foo,一的print_r($ _ GET)在process.php輸出這樣的:

Array 
(
    [var] => process.php 
) 

而我期望它應該這樣說:

Array 
(
    [var] => foo 
) 

那麼,爲什麼是var的值是process.php而不是foo?如何編寫此重寫規則,以便var獲得值foo

旁註:沒有問題,如果我提出這個process.php & .htaccess根或第二/第三/第四級,所有appropirate網址產生相同的結果:

像:

http://127.0.0.1/foo    //process.php & .htaccess in root 
http://127.0.0.1/somedir/foo  //process.php & .htaccess in htdocs/somedir 
http://127.0.0.1/somedir/2nd/foo //process.php & .htaccess in htdocs/somedir/2nd 

更新01:

我注意到$_SERVER["REDIRECT_QUERY_STRING"]等於var=foo,而$_SERVER["QUERY_STRING"]var=process.php

回答

2

在第一次看,我會說你在rewrite規則的正則表達式是越野車。 嘗試從

RewriteEngine on 
RewriteRule ^([^/]*)$ process.php?var=$1 [L] 

改變它

RewriteEngine on 
RewriteRule ([^/]+)$ process.php?var=$1 [L] 

如果錨定其向字符串的開頭(「^」)有沒有辦法能匹配,因爲你有一個「/」在字符串中。


在每個目錄級別使用RewriteRules稍微複雜一點。 REQUEST_URI可能不是您所期望的,所以一些規則會產生意想不到的結果。但是,在引用RewriteConditions中的匹配時,您通常可以解決問題。在這種情況下:

RewriteEngine on 
RewriteCond %{THE_REQUEST} "([^/]+) HTTP" 
RewriteRule^process.php?var=%1 [L] 

(注意是 '%',而不是在規則中的 '$')

+0

無影響。仍然'var'填充'process.php'而不是'foo' – DavChana 2012-07-28 09:20:20

+0

好吧,如果我測試它的事情是這樣工作的。請嘗試自己:http://martinmelin.se/rewrite-rule-tester/ – arkascha 2012-07-28 09:26:28

+0

是的,它在那裏工作,甚至在[http://htaccess.madewithlove.be/](http://htaccess.madewithlove.be /)它顯示'process.php?var = foo'是結果URL。但是在我的本地XAMPP上,它不是你可以在你的本地服務器上嘗試嗎?我也注意到'$ _SERVER [「REDIRECT_QUERY_STRING」]'等於'var = foo',而'$ _SERVER [「QUERY_STRING」]'var = process.php' – DavChana 2012-07-28 09:36:56

相關問題