You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Apache实现指定现有页面返回404状态码并保留URL及自定义404页面

解决方案

一、用mod_rewrite实现自定义404且无301重定向

你之前使用的RewriteRule ^/?(?:php|private)(/?|/.*)$ - [L,R=404]会触发外部重定向(R flag本质是强制重定向,哪怕状态码设为404),导致URL跳转。要解决这个问题,改用内部转发+设置404状态码的方式:

# 先配置自定义404页面(路径为站点根目录下的资源)
ErrorDocument 404 /my-custom-404-page.php

# mod_rewrite规则:匹配指定路径,内部转发到自定义404并返回404状态码
RewriteEngine On
RewriteRule ^/?(private|php)(/.*)?$ /my-custom-404-page.php [L,NC,QSA,status=404]
  • status=404:设置响应状态码为404,替代原R=404,避免触发重定向
  • NC:忽略大小写匹配(可选,按需调整)
  • QSA:保留原请求的查询参数(可选)
  • L:停止执行后续Rewrite规则

这样访问https://mywebsite.com/private/something时,URL保持不变,返回标准404状态码及响应头,同时展示自定义404页面内容,和真实不存在路径的404响应完全一致。

二、不使用mod_rewrite的实现方式

1. 用<LocationMatch>匹配URL路径

适合匹配任意URL(无论实际文件/目录是否存在):

# 先配置自定义404页面
ErrorDocument 404 /my-custom-404-page.php

# 匹配指定路径,直接返回404
<LocationMatch "^/(private|php)(/.*)?$">
    RedirectMatch 404 ^/(.*)$
</LocationMatch>

2. 针对真实存在的目录/文件

如果private是真实存在的目录,用<Directory>块配置:

ErrorDocument 404 /my-custom-404-page.php

<Directory "/var/www/html/private">
    Options -Indexes  # 禁用目录索引,避免暴露内容
    RedirectMatch 404 ^/(.*)$  # 返回404状态码
</Directory>

如果是特定后缀的文件(如*.php),用<Files>块:

ErrorDocument 404 /my-custom-404-page.php

<Files "*.php">
    RedirectMatch 404 ^/(.*)$
</Files>

关键注意事项

  • 自定义404页面必须使用站点根目录相对路径,不要带完整域名,否则会触发302/301重定向
  • 测试前清空浏览器缓存,避免旧的重定向缓存干扰结果

内容的提问来源于stack exchange,提问作者OGCJN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 09:15:34