有没有一种方法可以使用mod_rewrite主动为Apache的默认内置404页面提供多个URL? 不是一个自定义的错误文档,但像一个规则
RewriteCond %{REQUEST_URI} ^/dirname/pagename RewriteRule -- serve 404 page -----
我知道如何构build一个发送404头的PHP页面,并将mod_rewrite
redirect到那里的所有URL,但我更喜欢只基于mod_rewrite
的解决scheme。
我只是想redirect到一个不存在的地址:
RewriteCond %{REQUEST_URI} ^/dirname/pagename RewriteRule .* /sflkadsölfkasdfölkasdflökasdf
但是会在错误页面上给用户留言“/sflkadsölfkasdfölkasdflökasdfdoes not exist” ,这看起来有点不专业。
您可以使用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';