将默认域访问和不存在的链接重定向到具有特定条件的 404 页面

问题描述 投票:0回答:1

我有一个网站,默认情况下,它运行在 cgi-bin 目录中。但是,我的配置似乎有问题。当我输入系统上不存在的目录或文件时,它会重定向到 /cgi-bin/index.cgi,而不是像应该那样重定向到 404.html 页面。只有当我输入像domain/errorlink.pm这样的链接时,它才会重定向到404.html错误页面。这是各个部分的具体配置,包括.htaccess和Apache2:

.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://domain 时应指向 /cgi-bin/index.cgi。
  2. 将系统上不存在的链接重定向到 404 页面(例如 https://domain/error 或 https://domain/error.html)。这不仅适用于 https://domain.pm,还适用于其他不存在的链接。
.htaccess mod-rewrite apache2 cgi-bin
1个回答
0
投票

当我输入系统上不存在的目录或文件时,它会重定向到

/cgi-bin/index.cgi
,而不是像应该那样重定向到
404.html
页面。

是的,那是因为您的

.htaccess
文件中有以下规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* /cgi-bin/index.cgi [L]

这是一种“前端控制器模式”,它在内部将对非文件(包括物理目录)的所有请求重写为

/cgi-bin/index.cgi
。这自然会覆盖
ErrorDocument 404
指令,因此不会调用您的
/404.html
ErrorDocument。

如果您只想将对文档根的请求重写为

/cgi-bin/index.cgi
,则像这样修改上述规则(完全删除
RewriteCond
指令):

RewriteRule ^$ /cgi-bin/index.cgi [L]

现在,任何未映射到物理文件(您似乎称之为“链接”)或物理目录的请求都应该由 Apache

ErrorDocument 404
指令捕获。

只有当我输入像

domain/errorlink.pm
这样的链接时,它才会重定向到
404.html
错误页面。

因为你有一个特定的规则(

RewriteRule \.pm$ /404.html [L]
)来重写此类请求。但是,这不会触发 404 HTTP 响应状态,除非您正在进行一些额外的服务器端处理。

© www.soinside.com 2019 - 2024. All rights reserved.