2015-12-07 21 views
2

我有這種重寫條件,將所有不存在文件的請求重定向到父目錄中的app.php。mod_rewrite:通過.htaccess設置自定義頭文件

Options -MultiViews 
RewriteEngine On 


RewriteBase/
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond $1#%{REQUEST_URI} ([^#]*)#(.*)\1$ 
RewriteRule ^(.*)$ %2../app.php [L] 

在最後一行(重寫規則)$ 1的值是相對於地方.htacces,爲了使其便攜的目錄路徑(在這裏找到:http://linlog.skepticats.com/entries/2014/08/Using_RewriteBase_without_knowing_it.php)。

即:調用http://localhost/myapp/public/test123/r.txt我將在$ 1變量中獲取test123/r.txt(考慮到.htaccess是公開的/)。

我想$ 1的值傳遞給app.php,一個共同的解決辦法是將其追加爲查詢字符串:

RewriteRule ^(.*)$ %2../app.php?__path=$1 [L] 

這樣,我有__Path作爲GET變量( PHP:$ _REQUEST [「__ path」]),但它如何與POST等其他類型的請求一起工作(查詢字符串不應該在那裏)?

一個更乾淨的解決方案是將$ 1放入HTTP自定義標題中,但是,如何設置自定義標題,通過.htacess將MYAPP_PATH設置爲$ 1值?

+0

PS:我注意到了這個技巧?__ path = $ 1覆蓋了我在原始URL中傳遞的所有查詢字符串。因此,通過自定義標頭傳遞某些東西似乎是唯一的解決方案。 – alexroat

回答

1

要開始使用您的評論:

我已經注意到,招__路徑= $ 1以覆蓋所有我通過在原始URL查詢字符串?

You forgot to set the QSA flag

二到核心問題:

這樣,我有__Path作爲GET變量(PHP:$ _REQUEST [ 「__路徑」]),但它的工作原理與其他類型的如POST請求(查詢字符串不應該在那裏)?

這只是正常工作。 GET參數通常被稱爲,它們實際上是查詢字符串參數,可以用任何HTTP動詞傳遞,從GET和POST傳遞給PUT和DELETE。因此,如果您使用查詢字符串參數發佈到網址,您仍然可以從$_GET中讀取它們。

最後一點,以上解決了您的所有問題:請不要使用$_REQUEST。這真的是真的不好的做法,並可能導致晦澀的安全性和穩定性問題。改爲使用$_POST$_GET等。

+0

好的,問題是如果有人可以使用http:/ localhost/myapp/public/path?__ path = newpath ...來覆蓋這個$ _GET [「__ path」]等於newpath而不是path。那麼,考慮到請求可以僞造,這不是一個真正的問題。 – alexroat