2017-02-19 40 views
1

使用.htaccess我希望將%{PATH_INFO}轉換爲用於引導的查詢字符串參數。但我想阻止訪問者手動輸入引導參數。刪除某些查詢字符串參數,除非通過重寫添加

所以這個輸入的URL: www.example.com/user/pictures?id=65

實際上顯示: www.example.com?bootstrap=/user/pictures & ID = 65

但如果手動輸入

此輸入的URL: www.example.com?bootstrap=/user/pictures &我d = 65

刪除它: www.example.com?id=65

或顯示錯誤: 404:未找到

最好的情況下

手動輸入的引導被忽略,並且%{PATH_INFO}成爲一個新的參數。

所以這個: www.example.com/user/pictures?id=65 &引導= somecrap

顯示: www.example.com?id=65 &引導= /用戶/圖片

阻止手動輸入的引導程序參數有兩個原因。 1)安全。我們不希望用戶狩獵和啄食不打算顯示的文件。 2)衝突。我們不想在手動輸入的引導程序和正確的%{PATH_INFO}之間進行選擇。

刪除引導參數很容易。像...

RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

添加參數很容易。 (我的是更復雜,但這給出了這個概念。)

RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI}%{PATH_INFO} (.*?)(/.+)\2$ 
RewriteRule ^(.*)$ /%1?bootstrap=%2 [QSA,L] 

如果htaccess的剛跑一次通過,這兩個片段會做的伎倆。但是,相反,每次重寫後,htaccess都會重新啓動,並且我添加的引導參數會再次被刪除。

我知道quick-n-dirty的修復方法是將[END]添加到第二條規則,但是這不會在這裏工作。

我需要的是一種從原始請求中刪除?「bootstrap = xxx」的方法,而不是從重寫的請求中刪除。

感謝

回答

3

要認識到,如果這是原來的請求或沒有,你可以檢查某些REDIRECT_變量

REDIRECT_ environment variables are created from the environment variables which existed prior to the redirect. They are renamed with a REDIRECT_ prefix, i.e., HTTP_USER_AGENT becomes REDIRECT_HTTP_USER_AGENT .

REDIRECT_URL , REDIRECT_STATUS , and REDIRECT_QUERY_STRING are guaranteed to be set, and the other headers will be set only if they existed prior to the error condition.

你的情況

所以,你可能會檢查REDIRECT_STATUSREDIRECT_QUERY_STRING看,如果這是一個外部或內部請求。僅

刪除bootstrap=,如果這是一個外部請求,即REDIRECT_QUERY_STRING是空

RewriteCond %{REDIRECT_QUERY_STRING} ^$ 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

另一種方法將是類似的,但現在檢查變量是空的,例如

RewriteCond %{REDIRECT_QUERY_STRING} . 
RewriteCond %{QUERY_STRING} ^(.*&)?bootstrap=[^&]*(?:&(.*))?$ [NC] 
RewriteRule^%{REQUEST_URI}?%1%2 [L,NE] 

您也可以檢查一個特定的值,如果這是適當的。

+0

非常好的使用'REDIRECT_QUERY_STRING' ++ – anubhava

2

做到這一點的方法是設置環境變量上一個成功的改寫,您可以用E標誌做。因此,像這樣:

RewriteRule ^example$ ?param=example [E=rewritten:1] 

然後,您可以檢查它的狀態:

RewriteCond %{ENV:rewritten} !=1 

或者:

RewriteCond %{ENV:rewritten} =1 

然而,在.htaccess使用這個時候你要小心,因爲如果通過.htaccess文件完成並且生成了內部重定向,則生成的所有環境變量都將得到REDIRECT_前綴t他們。因此,對於後續的經過,還需要在大多數情況下,檢查是否存在,或者只是說,如果你的規則是上面在其中添加環境變量:

RewriteCond %{ENV:REDIRECT_rewritten} !=1 

或者:

RewriteCond %{ENV:REDIRECT_rewritten} =1 

參考: