[英]Redirect to Apache built-in 404 page with mod_rewrite?
有沒有辦法使用mod_rewrite為許多URL主動提供Apache的默認內置404頁面 ? 不是自定義錯誤文檔,而是像
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule -- serve 404 page -----
我知道如何構建一個發送404標頭的PHP頁面,並讓mod_rewrite
重定向所有的URL,但我更喜歡僅基於mod_rewrite
的解決方案。
我剛想到了重定向到一個不存在的地址:
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule .* /sflkadsölfkasdfölkasdflökasdf
但這會在錯誤頁面上給用戶提供“/sflkadsölfkasdfölkasdflökasdf不存在”的消息,這看起來有點不專業。
您可以使用RewriteRule
上的R
標志強制使用給定狀態代碼進行重定向:
雖然這通常用於重定向,但可以在此處給出任何有效的狀態代碼。 如果狀態代碼超出重定向范圍(300-399),則刪除替換字符串並停止重寫,就像使用L標志一樣。
所以這:
RewriteRule ^/?page\.html$ - [R=404]
將返回/page.html
的默認404頁面。 由於這是一個正則表達式,請記住轉義\\.
並錨定$
。
-
被忽略(即“替換字符串被刪除”),但仍然需要有一些東西來保持規則格式良好。
最好的方法是使用狀態代碼404設置R標志:
RewriteCond %{REQUEST_URI} ^/dirname/pagename
RewriteRule ^ - [L,R=404]
但這只能在Apache 2之后使用。
我證實了這一點
RewriteRule ^ - [L,R=404]
要么
RewriteRule ^ - [L,redirect=404]
不行。 以下是官方Apache網站的解釋:
但是,如果狀態代碼在重定向范圍(300-399)之外,則替換字符串將完全丟棄,並且重寫將停止,就像使用了L一樣。
所以最好的解決方案是使用404標頭重定向到404.php文件,如后面所述。
這應該工作:
RewriteEngine on
RewriteRule ^/page.html /error404.html [L]
雖然這不會給404標題。 您可以嘗試chaning標記為[L,R=404]
但我懷疑它是否有效(它應該只用於重定向)。
你在PHP中這樣做的想法是有效的。 如果您的所有“錯誤頁面”頁面都是服務器端(即PHP),那么您可以簡單地使用此代碼:
<?php
header( 'HTTP/1.0 404 Not Found' );
include 'error404.html';
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.