配置Apache:默认域名指向cgi-bin及不存在链接跳转404页面
问题说明
我的网站默认运行在cgi-bin目录,但当前配置存在异常:
- 访问不存在的目录或文件时,会跳转到
/cgi-bin/index.cgi,而非预期的404.html页面 - 仅访问
.pm后缀的不存在链接(如example.com/errorlink.pm)时,才会跳转至404.html页面
当前配置文件如下:
.htaccess 配置
AddDefaultCharset utf-8 RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION:%1] RewriteRule ^webdav /cgi-bin/webdav.cgi [L] RewriteRule ^api/(\w+)/(\w+)$ /cgi-bin/xapi.cgi [L] RewriteRule \.pm$ /404.html [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* /cgi-bin/index.cgi [L] ErrorDocument 404 /404.html <IfModule mod_php5.c> php_flag engine off </IfModule>
Apache2 虚拟主机配置
<VirtualHost IP:8443> ServerName localhost ServerAdmin admin@localhost DocumentRoot /home/admin/web/domains/public_html ScriptAlias /cgi-bin/ /home/admin/web/domains/cgi-bin/ Alias /vstats/ /home/admin/web/domains/stats/ #SuexecUserGroup admin admin CustomLog /var/log/apache2/domains/domains.bytes bytes CustomLog /var/log/apache2/domains/domains.log combined ErrorLog /var/log/apache2/domains/domains.error.log <Directory /home/admin/web/domains/stats> AllowOverride All </Directory> <Directory /home/admin/web/domains/public_html> AllowOverride All Require all granted SSLRequireSSL Options +Includes -Indexes +ExecCGI </Directory> <Directory /home/admin/web/domains/cgi-bin> Options +ExecCGI AddHandler cgi-script .cgi .pl .py .rb </Directory> SSLEngine on SSLVerifyClient none SSLCertificateFile /home/admin/conf/web/domains/ssl/domains.crt SSLCertificateKeyFile /home/admin/conf/web/domains/ssl/domains.key SSLCertificateChainFile /home/admin/conf/web/domains/ssl/domains.ca <FilesMatch \.php$> SetHandler "proxy:unix:/run/php/php7.4-fpm-domains.sock|fcgi://localhost" </FilesMatch> SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0 IncludeOptional /home/admin/conf/web/domains/apache2.ssl.conf_* IncludeOptional /etc/apache2/conf.d/*.inc </VirtualHost>
需求目标
- 默认访问
https://example.com时,指向/cgi-bin/index.cgi - 所有不存在的链接(包括无后缀、
.html等,不限.pm后缀)均跳转至404.html页面
修改方案
问题核心是.htaccess的重写规则顺序错误,导致不存在的请求被优先转发到cgi-bin/index.cgi,而非触发404逻辑。以下是修正后的配置:
修改后的.htaccess
AddDefaultCharset utf-8 RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_CGI_AUTHORIZATION:%1] # 处理根域名访问,指向cgi-bin首页 RewriteRule ^$ /cgi-bin/index.cgi [L] # 保留原有特定业务路由 RewriteRule ^webdav /cgi-bin/webdav.cgi [L] RewriteRule ^api/(\w+)/(\w+)$ /cgi-bin/xapi.cgi [L] # 检查请求的文件/目录是否存在,不存在则跳转404 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .* /404.html [L] ErrorDocument 404 /404.html <IfModule mod_php5.c> php_flag engine off </IfModule>
修改说明
- 新增首页规则:
RewriteRule ^$ /cgi-bin/index.cgi [L]直接指定根域名访问的目标,满足需求1。 - 调整规则顺序:将「检查文件/目录是否存在」的逻辑移到全局转发之前,确保所有不存在的请求优先触发404跳转。
- 移除错误的全局转发:原有的
RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* /cgi-bin/index.cgi [L]会拦截所有不存在的文件请求,这是404失效的根本原因,直接删除即可。 - 保留业务路由:原有的webdav和api路由规则保持不变,确保业务功能正常。
验证步骤
- 保存修改后的
.htaccess文件 - 重启Apache服务:
sudo systemctl restart apache2 - 测试场景:
- 访问根域名
https://example.com,确认跳转到/cgi-bin/index.cgi - 访问不存在的路径(如
https://example.com/error、https://example.com/test.html),确认跳转至404.html - 访问
.pm后缀的不存在链接,确认同样跳转至404.html - 访问webdav和api路径,确认功能正常
- 访问根域名
内容的提问来源于stack exchange,提问作者NoMore
相关产品推荐
相关产品推荐

