禁止URL直接访问网站目录且不阻断内部调用 解决重定向冲突显示自定义404
问题根源
- 虚拟主机配置开启了
MultiViews内容协商功能,和重写规则、目录访问拦截逻辑冲突,是触发循环重定向的核心原因 - 原有重写规则仅处理非目录、非文件的请求,真实目录的访问没有被纳入自定义逻辑,只能触发Apache默认的403响应,而你将403响应指向的自定义错误页路径和拦截的目录路径存在匹配混淆
第一步:修改httpd-vhosts.conf配置
删除Directory配置段中的+MultiViews选项,调整后如下:
<VirtualHost *:80> ServerName localhost ServerAlias localhost DocumentRoot "${INSTALL_DIR}/www" <Directory "${INSTALL_DIR}/www/"> Options +Indexes +Includes +FollowSymLinks -MultiViews AllowOverride All Require all granted </Directory> ErrorDocument 403 /website/views/404.php </VirtualHost>
修改后重启Wamp的Apache服务使配置生效。
第二步:调整.htaccess配置
调整规则顺序,新增目录访问拦截逻辑,完整配置如下:
Options +FollowSymlinks -Indexes DirectoryIndex disabled RewriteEngine on # 拦截所有真实目录的直接访问,直接返回404 RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [R=404,L] # 首页规则 RewriteRule ^$ index.php [L] # 路径重写规则(仅排除真实存在的文件) RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^([a-zA-Z0-9\-_\/]*)$ index.php?p=$1 [L] # 自定义错误页配置 ErrorDocument 404 /website/views/404.php ErrorDocument 403 /website/views/404.php <files .htaccess> order allow,deny deny from all </files>
配置说明
- 新增的目录拦截规则会在所有重写逻辑前生效,只要请求指向真实存在的目录(如views、controllers),就直接返回404状态码,加载你配置的自定义错误页,不会触发Apache默认的DirectorySlash重定向逻辑,也不会进入循环
- 删除了原重写规则中
!-d的判断,因为所有目录请求已经被前置规则拦截,剩余请求仅需排除真实文件即可正常进入你的index.php路由逻辑 - 全程保留
DirectorySlash默认开启状态,不存在对应的安全风险 - 原有正常路由逻辑不受任何影响
内容的提问来源于stack exchange,提问作者Chris Stark
相关产品推荐
相关产品推荐

