2016-09-08 39 views
1

我的目標是降低我應用程序簽名的可見性。這並非默默無聞,而僅僅是深度防禦的淺薄表現,因此乍一看攻擊者無法判斷它是否爲靜態站點。 (也是美容;即使在正常操作中它們永遠不會變得可見,它只是覺得「更清潔」以隱藏應用細節)。因此,我想拒絕訪問某些目錄而不透露它們存在,因此如果用戶請求不存在的頁面,我必須給出與應用程序相同的404響應。mod_rewrite強制內部重定向

.htaccess文件,我有以下幾點:

RewriteEngine on 
RewriteCond "%{REQUEST_FILENAME}" "!-f" 
RewriteCond "%{REQUEST_FILENAME}" "!-d" 
RewriteRule "^(.*)" "index.php?page=$1" 
RewriteRule "^(secret_dir1|secret_dir2)(/.*)?$" "index.php?page=404" 

其中index.php根據「網頁」的值呈現一個好的漂亮的網頁GET參數;如果「頁面」與應用程序級別的頁面不對應,或者「頁面」設置爲404,則該腳本將呈現具有適當標題和所有內容的漂亮404頁面。

這是問題發生的地方。 「應用程序級」404s按預期工作;一個404頁面被渲染。但是,如果用戶請求mydomain.com/dir_i_am_trying_to_hide,他們會得到301重定向到mydomain.com/dir_i_am_trying_to_hide/?page=404:外部重定向而不是內部重寫。

它爲什麼發出一個外部重定向而不是隻重寫url?我該如何正確地避免這種情況?除此之外,是否有強制服務器執行內部重寫的方法? (Apache的文檔似乎表明你可以強制重寫規則是外部的,但不是相反的方式)

+0

要清楚,'^ dir_i_am_trying_to_hide'不是真正的正則表達式:D – dn3s

+0

這些規則不應該導致301.也許你的index.php裏面有一些東西在做它? –

+0

我無法想象什麼。我只在整個應用程序中調用了header()函數,這是'header(「$ {_ SERVER [」SERVER_PROTOCOL「]} 404 Not Found」);'在呈現404頁面之前。 – dn3s

回答

2

原來我的重寫規則沒有導致外部重定向; Apache的DirectorySlash是;我會查詢hostname/secret_dir1,它會發送一個重定向到hostname/secret_dir1/

我不知道爲什麼查詢字符串被更改,但添加DirectorySlash off修復了它。