.htaccess中RewriteCond参数错误致500报错及子域名访问异常求助
解决CodeIgniter部署时.htaccess导致的500错误及子域名访问问题
错误原因定位
你遇到的500内部服务器错误,根源是.htaccess中这段无效的规则:
RewriteCond $1
RewriteCond语法要求必须包含条件表达式(比如比较、匹配逻辑),单独的$1没有任何有效判断逻辑,属于非法参数,直接触发Apache报错。
修正后的完整.htaccess配置
以下是兼顾CodeIgniter路由、HTTPS强制跳转、文件保护,同时解决子域名访问问题的配置:
# 启用URL重写引擎 RewriteEngine On RewriteBase / # 强制所有请求跳转至HTTPS RewriteCond %{HTTPS} off RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301] # CodeIgniter核心路由规则 # 跳过真实存在的文件/目录,避免干扰子域名或静态资源访问 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d # 排除无需转发的路径 RewriteCond $1 !^(index\.php|resources|robots\.txt) # 将其余请求转发给CodeIgniter的index.php处理 RewriteRule ^(.*)$ index.php/$1 [L,QSA] # 禁止目录索引,防止泄露目录结构 Options All -Indexes # 禁止访问ZIP/RAR压缩包文件 <FilesMatch "(?i)\.(zip|rar)$"> Deny from all </FilesMatch>
关键修正说明
- 移除无效规则:直接删除了导致500错误的
RewriteCond $1及对应重复的RewriteRule,消除语法错误。 - 调整规则顺序:先执行HTTPS强制跳转,再处理CodeIgniter路由,逻辑更合理,避免跳转后重复触发路由规则。
- 保留子域名兼容逻辑:
RewriteCond %{REQUEST_FILENAME} !-d会让指向真实子目录的子域名请求跳过CodeIgniter路由,直接访问对应目录,解决权限失败问题。
子域名访问额外排查点
如果子域名仍无法访问,可检查以下内容:
- 确认cPanel中子域名的文档根目录设置正确(比如
sub.example.com应指向public_html/sub)。 - 检查子目录权限:目录权限设为
755,文件权限设为644,确保Apache进程拥有读取权限。 - 若子目录有独立的
.htaccess,需确保其规则与主目录的配置无冲突。
内容的提问来源于stack exchange,提问作者Mohammad Kahfi
相关产品推荐
相关产品推荐

