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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:35:34