我有一个网站,默认情况下,它运行在 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>
我想修改如下:
- 默认情况下,访问 https://domain 时应指向 /cgi-bin/index.cgi。
- 将系统上不存在的链接重定向到 404 页面(例如 https://domain/error 或 https://domain/error.html)。这不仅适用于 https://domain.pm,还适用于其他不存在的链接。
当我输入系统上不存在的目录或文件时,它会重定向到
,而不是像应该那样重定向到/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 响应状态,除非您正在进行一些额外的服务器端处理。