.htaccess配置求助:404页面重定向异常及额外需求
问题分析与修复方案
1. 访问www.example.com/news.phpdsadsadsa出现文件选择页面
这是Apache内容协商模块(mod_negotiation)在尝试匹配最接近的现有文件(news.php)导致的,即便已设置Options -MultiViews,仍可能存在配置冲突。可通过以下方式解决:
- 强制关闭内容协商,修改
Options行:Options -MultiViews -Negotiate - 或者添加规则直接拦截此类无效请求,返回404:
# 拦截类似xxx.phpxxx的无效请求 RewriteRule ^.*\.php.+$ - [R=404,L]
2. 访问www.example.com/news/dsadsadsa打开空页面
当前规则会将所有/news/xxx格式的请求转发到news.php?url=xxx,无论xxx对应的内容是否存在。有两种处理方式:
方式A:在.htaccess中添加存在性检查(适用于静态内容场景)
如果新闻内容对应服务器上的文件(如news/xxx.html),添加条件仅当文件存在时才转发:
RewriteCond %{DOCUMENT_ROOT}/news/%1.html -f RewriteRule ^news/([0-9a-zA-Z_-]+)$ /news.php?url=$1 [NC,L]
方式B:在news.php中动态判断(适合动态内容)
在news.php开头添加逻辑,检查请求的内容是否存在,不存在则触发404:
<?php $url = $_GET['url'] ?? ''; // 替换为实际内容存在性判断逻辑(如数据库查询) $contentExists = false; if (!$contentExists) { http_response_code(404); include 'error.php'; exit; } // 原有页面逻辑 ?>
3. 访问index.php或index.html直接跳转错误页
移除原有重定向规则,替换为直接返回404的规则:
# 拦截index.html/index.php,直接返回404 RewriteRule ^index\.(html|php)$ - [R=404,L]
若需要显式跳转至错误页,可改用:
RewriteRule ^index\.(html|php)$ /error.php [L,R=301]
完整修复后的.htaccess配置
Options -MultiViews -Negotiate RewriteEngine on ErrorDocument 404 /error.php # 拦截index.html/index.php,直接返回404 RewriteRule ^index\.(html|php)$ - [R=404,L] # 拦截类似xxx.phpxxx的无效请求 RewriteRule ^.*\.php.+$ - [R=404,L] # 域名跳转(添加www前缀) RewriteCond %{HTTP_HOST} ^example.com [NC] RewriteRule ^(.*)$ http://www.example.com/$1 [L,R=301,NC] # 新闻URL重写(带静态文件存在性检查) RewriteCond %{DOCUMENT_ROOT}/news/%1.html -f RewriteRule ^news/([0-9a-zA-Z_-]+)$ /news.php?url=$1 [NC,L] # 分类URL重写(同理可添加存在性检查) RewriteCond %{DOCUMENT_ROOT}/category/%1.html -f RewriteRule ^category/([0-9a-zA-Z_-]+)$ /category.php?kategori=$1 [NC,L]
注意事项
- 测试前清空浏览器缓存,避免301重定向缓存影响结果。
- 动态内容场景优先选择PHP文件内判断,灵活性更高。
- 确保Apache已启用
mod_rewrite模块。
内容的提问来源于stack exchange,提问作者alvian ramaditya
相关产品推荐
相关产品推荐

