簡體   English   中英

使用mod_rewrite重定向到Apache內置404頁面?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM