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

配置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>

需求目标

  1. 默认访问https://example.com时,指向/cgi-bin/index.cgi
  2. 所有不存在的链接(包括无后缀、.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>

修改说明

  1. 新增首页规则:RewriteRule ^$ /cgi-bin/index.cgi [L] 直接指定根域名访问的目标,满足需求1。
  2. 调整规则顺序:将「检查文件/目录是否存在」的逻辑移到全局转发之前,确保所有不存在的请求优先触发404跳转。
  3. 移除错误的全局转发:原有的RewriteCond %{REQUEST_FILENAME} !-f RewriteRule .* /cgi-bin/index.cgi [L]会拦截所有不存在的文件请求,这是404失效的根本原因,直接删除即可。
  4. 保留业务路由:原有的webdav和api路由规则保持不变,确保业务功能正常。

验证步骤

  1. 保存修改后的.htaccess文件
  2. 重启Apache服务:sudo systemctl restart apache2
  3. 测试场景:
    • 访问根域名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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 22:33:16