2015-09-25 96 views
1

我想爲Apache 2.2中的.htaccess文件中的一組特定的RewriteCond創建特定的403消息(或頁面)。我從來沒有見過這樣做,但似乎它應該是可能的。特定的RewriteCond自定義403頁面

我的.htaccess訪問文件的相關部分看起來是這樣的:

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^Baiduspider.* [NC] 
RewriteRule .* - [F] 

正如你所看到的,我剛剛從接入阻止他們如果用戶代理我的RewriteCond匹配。

多一點細節

這個偉大的工程阻止違規的機器人,但我們碰到一個稍微惱人的問題。我們的網站被許多技術人員訪問。他們自己做了很多編程,並經常使用瀏覽器插件,如「用戶代理切換器」。

我想在此特定實例中提供更有意義的消息。以便他們知道將「用戶代理切換器」更改爲普通瀏覽器。我不希望只提供正常的403頁面,而是希望在此發佈更友好的消息。

我知道我可以將它傳遞給我們的腳本引擎,拔出用戶代理並傳遞自定義頭文件,但似乎這可能會有更優雅的.htaccess解決方案。

回答

2

所以...爲什麼不只是重定向到一個自定義的403文件?並在該HTML文件,你把你想要的。機器人總是會被送到那裏。

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^Baiduspider.* [NC] 
RewriteCond %{REQUEST_URI} !^/errorpages/403.html [NC] 
RewriteRule ^.* /errorpages/403.html [R,L] 
+0

這是真的很接近我所需要的。我碰到的一個問題是,你上面提到的條件不包括訪問403頁面。你陷入循環,瀏覽器出錯。對於訪問此答案的其他人,您是否可以修改答案以使用403的errorpages目錄(因爲根級被您的語句阻塞),然後將其作爲第一個條件:'RewriteRule^errorpages - [L,NC ]'如果你這樣做,我測試過,它的工作原理。在修復之後,我會讓你高興。 – Terry

+0

@特里是的,你說得很對。我修復它,所以它不應該導致循環。 –

1

假設你有一個定製 403錯誤頁面,你可以只在您的錯誤頁面相同的用戶代理檢查,並顯示相應的反應。或者,在.htaccess中設置一個特定的環境變量(例如SPECIAL_ERROR),然後在錯誤頁面中檢查這個變量。例如:

RewriteEngine On 
RewriteCond %{HTTP_USER_AGENT} ^Baiduspider.* [NC] 
RewriteRule .* - [F,E=SPECIAL_ERROR:1] 

這樣可以避免「重定向」往返。

然後,在你的403錯誤頁面...(PHP爲例):

if (getenv('SPECIAL_ERROR')) { 
    // friendly error 
} else { 
    // Default 403 
} 
+0

這實際上非常有用。我不知道你可以像這樣在htaccess中設置特殊的環境變量。 – Terry