2011-10-03 80 views
2

我有.htaccess目前設置爲重寫任何沒有句點或斜槓與.php擴展名相當(所以「富」內部拉起「foo.php」 )通過如下:「欺騙」404找不到錯誤與.htaccess

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !(.*)\.php 
RewriteCond %{REQUEST_FILENAME}\.php -f 
RewriteRule ^([^/.]+)$ $1.php [L,NS] 

不過,我想直接請求「foo.php」有404回來,就好像該文件不存在(就好像有人試圖「foo.asp」或「foo.blargh」)。我知道有[F]和[G]標誌,但我不希望「禁止」(403)或「消失」(410),因爲這些不同於不存在文件返回的結果(404)。

有沒有辦法做到這一點?

更新1

我已經試過

RewriteCond %{REQUEST_FILENAME} \.php$ 
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*\.php\ HTTP/ 
RewriteRule ^(.*)$ /error.php?e=404 [R=404,L,NS] 

其中一期工程...直到我嘗試使用ErrorDocument處理程序。假設「error.php」我的文檔根目錄,沿ErrorDocument 404 /error?e=404線東西(我也試過用error.php等)反芻錯誤

未找到

請求的URL /foo.php在此服務器上未找到。

此外,遇到500內部服務器錯誤錯誤,而 試圖使用ErrorDocument來處理請求。

...但只有當試圖訪問實際存在的.php頁面(如foo.php);任何嘗試訪問實際上不存在的頁面(因此不會觸發我的第二條重寫規則)將進入由ErrorDocument處理程序指定的頁面。

+0

[R = 404]無效。你是否嘗試重寫一個不存在的文件?例如:'RewriteRule ^(。*)$ dummy404.htm [L,NS]'。這應該會導致404錯誤。 – Floern

+0

此路由的問題是,我得到'在此服務器上未找到請求的URL /dummy.htm .'而不是'在此服務器上找不到請求的URL /foo.php。 ' –

回答

5

實測值的溶液:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ (/.*)\.php 
RewriteCond %{REQUEST_FILENAME} -f 
RewriteCond %{REQUEST_URI} !^/error\.php 
RewriteRule . - [R=404,L,NS] 

ErrorDocument 404 /error.php?e=404 

具體地,第三的RewriteCond保持爲錯誤的頁面請求從觸發重寫規則(因爲THE_REQUEST仍然包含原來的請求(匹配第一的RewriteCond),和錯誤頁面確實存在(匹配第二個RewriteCond)

請注意,第三個RewriteCond匹配爲ErrorDocument指定的URI格式在error.php中,我使用$_SERVER["REDIRECT_SCRIPT_URL"]找出用戶最初請求的文件(從而使它看起來像404一樣擔任直接回應他們的要求)。