Apache2.4配置Directory Alias出现403错误,求排查思路
问题描述
使用Apache 2.4搭配Tomcat 9与mod_jk运行JEE应用,为避免视频等大体积静态内容占用JEE应用存储空间,在服务器上创建了专用目录/etc/mondir/video并配置Apache虚拟主机的Directory Alias,但访问时出现403错误。已尝试以下操作但均无效:
- 调整虚拟主机中Directory指令的多种配置
- 尝试在
/etc/apache2/mods-available/alias.conf中声明目录别名 - 确认目标目录归属www-data用户(Apache运行用户)
附上虚拟主机配置代码:
<VirtualHost *:443> ServerName mondomaine.com ServerAlias www.mondomaine.com ServerAdmin webmaster@localhost #DocumentRoot /var/www DocumentRoot /etc/mondir/ <Directory /etc/mondir/> Options FollowSymLinks AllowOverride None </Directory> #Add acces to static ressource in /etc/mondir Alias "/video" "/etc/mondir/video" Alias "/moncontext/video" "/etc/mondir/video" <Directory "/etc/mondir/video"> #Options Indexes MultiViews FollowSymLinks #AllowOverride None #Order allow,deny #Allow from all #Options FollowSymlinks #AllowOverride None #Require all granted Options Indexes FollowSymLinks MultiViews AllowOverride All Require local </Directory> RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.mondomaine\.com RewriteRule ^video/(.*) /video/$1 [L,QSA] RewriteRule ^video(.*) /video/$1 [L,QSA] RewriteRule ^moncontext/(.*) /moncontext/$1 [L,QSA] RewriteRule ^moncontext(.*) /moncontext/$1 [L,QSA] RewriteRule ^(.*) /moncontext/$1 [L,QSA] Include /etc/letsencrypt/options-ssl-apache.conf SSLCertificateFile /etc/letsencrypt/live/mondomaine.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/mondomaine.com/privkey.pem JkMount /moncontext/* ajp13_worker </VirtualHost>
排查线索与解决方案
1. 修正目录访问权限配置
你的/etc/mondir/video目录配置中使用了Require local,这仅允许本地主机访问该目录,外部用户访问自然会返回403。需要将其替换为允许外部访问的规则:
<Directory "/etc/mondir/video"> Options Indexes FollowSymLinks MultiViews AllowOverride None Require all granted </Directory>
注:如果只需要特定IP段访问,可以用Require ip 192.168.1.0/24这类规则,根据需求调整。
2. 检查目录系统权限
除了目录归属www-data用户,还要确保目录及上级目录有执行权限(Apache需要遍历目录结构):
- 执行命令设置目录权限:
chown -R www-data:www-data /etc/mondir chmod -R 755 /etc/mondir - 额外检查
/etc目录的权限,默认/etc权限为drwxr-xr-x(所有者root,组root,其他用户有读和执行权限),如果被修改过需要恢复,否则Apache无法进入/etc/mondir目录。
3. 调整Rewrite规则避免冲突
你的Rewrite规则最后一条RewriteRule ^(.*) /moncontext/$1 [L,QSA]会将所有未匹配的请求转发到/moncontext/路径下,可能覆盖Alias的规则。需要修改Rewrite规则,让静态资源路径优先匹配:
RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.mondomaine\.com # 优先匹配静态资源路径,避免被转发到Tomcat RewriteRule ^video/(.*)$ /video/$1 [L,QSA] RewriteRule ^moncontext/video/(.*)$ /moncontext/video/$1 [L,QSA] # 其他moncontext路径转发到Tomcat RewriteRule ^moncontext/(.*)$ /moncontext/$1 [L,QSA] # 剩余请求转发到moncontext RewriteRule ^(.*)$ /moncontext/$1 [L,QSA]
或者更简洁的方式,在Rewrite规则前添加条件,排除静态资源路径:
RewriteEngine on RewriteCond %{HTTP_HOST} ^www\.mondomaine\.com # 排除/video和/moncontext/video路径,不转发到Tomcat RewriteCond %{REQUEST_URI} !^/video/ RewriteCond %{REQUEST_URI} !^/moncontext/video/ RewriteRule ^(.*)$ /moncontext/$1 [L,QSA]
4. 避免将/etc作为DocumentRoot
/etc是系统配置目录,默认安全策略限制较多,不建议将其设置为DocumentRoot。建议将静态资源目录迁移到/var/www或其他专门的网站目录,比如/var/www/mondir,然后修改配置中的路径:
DocumentRoot /var/www/mondir/ <Directory /var/www/mondir/> Options FollowSymLinks AllowOverride None Require all granted </Directory> Alias "/video" "/var/www/mondir/video" Alias "/moncontext/video" "/var/www/mondir/video" <Directory "/var/www/mondir/video"> Options Indexes FollowSymLinks MultiViews AllowOverride None Require all granted </Directory>
5. 验证Apache配置并重启
每次修改配置后,执行以下命令验证配置正确性并重启Apache:
apache2ctl configtest systemctl restart apache2
内容的提问来源于stack exchange,提问作者Adrien
相关产品推荐
相关产品推荐

