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

Laravel多项目部署遇Apache 403 Forbidden错误求助

Apache 403 Forbidden 访问/admin路径问题排查与解决

项目概况

项目位于/var/www/html/xyz,内部包含多个子项目,结构如下:

var/www/html/xyz/public_site
var/www/html/xyz/admin
var/www/html/xyz/frontend
var/www/html/xyz/api
...

这些子项目整合为xyz单项目运行,部分为Vue.js前端组件,部分是后端或API服务。已在Ubuntu的Apache2上配置虚拟主机,访问xyz.local正常,但访问xyz.local/admin时出现403 Forbidden错误。

当前配置信息

虚拟主机配置

<VirtualHost *:80>
ServerAdmin webmaster@xyz
ServerName xyz.local
DocumentRoot /var/www/html/xyz.com/public_html/

<Directory /var/www/html/xyz.com/public_html/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

public_html目录下的.htaccess内容

<IfModule mod_rewrite.c>
<IfModule mod_negotiation.c>
    Options -MultiViews
</IfModule>

RewriteEngine On

#Redirect Trailing Slashes...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

#Handle Front Controller...
#RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ index.php [L]

#Handle Admin Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} ^/admin [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ admin.php [L]

#Handle API Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} ^/api [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ api.php [L]

#Handle adminRestaurant Controller...
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ adminRest.php [L]

#Handle APIV2 Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} ^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^((?s).*)$ apiV2.php?_url=/$1 [QSA,L]


#Handle Checkin App Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} ^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ check-in.php [L]

#Handle Callsearch App Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ callsearch.php [L]

#Handle Security App Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ security-app.php [L]

#Handle Delivery App Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/social [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ delivery-app.php [L]

#Handle Social App Controller...
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/admin [NC]
RewriteCond %{REQUEST_URI} !^/opelia [NC]
RewriteCond %{REQUEST_URI} !^/api/v2 [NC]
RewriteCond %{REQUEST_URI} !^/api [NC]
RewriteCond %{REQUEST_URI} !^/check-in [NC]
RewriteCond %{REQUEST_URI} !^/callsearch [NC]
RewriteCond %{REQUEST_URI} !^/security-app [NC]
RewriteCond %{REQUEST_URI} !^/delivery-app [NC]
RewriteCond %{REQUEST_URI} !^/uploads [NC]
RewriteRule ^ social.php [L]


RewriteRule ^uploads/(.*)$ https://xyz-files-new.s3.amazonaws.com/uploads/$1[R=301,L]
#Handle Authorization Header
RewriteCond %{HTTP:Authorization} .
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
</IfModule>


#php -- BEGIN cPanel-generated handler, do not edit
#Set the “ea-php56” package as the default “PHP” programming language.
<IfModule mime_module>
#AddType application/x-httpd-ea-php56 .php .php5 .phtml
#AddType application/x-httpd-ea-php70 .php .php5 .phtml
</IfModule>
#php -- END cPanel-generated handler, do not edit 

Apache error.log日志内容

Permission denied: [client 127.0.0.1:54374] AH00035: access to /admin denied (filesystem path '/var/www/html/xyz.com/public_html') because search permissions are missing on a component of the path

问题分析与解决步骤

1. 修正路径不匹配问题

项目实际路径是/var/www/html/xyz,但虚拟主机配置的DocumentRoot指向了/var/www/html/xyz.com/public_html/,两者完全不匹配。/admin子项目位于/var/www/html/xyz/admin,Apache当前找不到该路径,直接触发权限错误。

2. 修复目录权限

日志提示路径缺少搜索权限,执行以下命令给Apache进程(默认用户www-data)赋予正确的访问权限:

# 设置目录所有者为Apache用户
sudo chown -R www-data:www-data /var/www/html/xyz

# 配置目录和文件的权限
sudo find /var/www/html/xyz -type d -exec chmod 755 {} \;
sudo find /var/www/html/xyz -type f -exec chmod 644 {} \;

3. 更新虚拟主机配置

将虚拟主机的根目录改为项目实际的对外访问目录(通常是public_site),并添加admin子目录的访问配置:

<VirtualHost *:80>
ServerAdmin webmaster@xyz
ServerName xyz.local
DocumentRoot /var/www/html/xyz/public_site/

<Directory /var/www/html/xyz/public_site/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

# 配置admin子目录的访问权限
<Directory /var/www/html/xyz/admin/>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

4. 适配Vue.js前端路由(若admin是Vue项目)

如果admin是独立的Vue应用,需要在/var/www/html/xyz/admin目录下添加.htaccess文件,支持前端路由跳转:

<IfModule mod_rewrite.c>
  RewriteEngine On
  RewriteBase /admin/
  RewriteRule ^admin\.html$ - [L]
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule . /admin/index.html [L]
</IfModule>

5. 重启Apache服务使配置生效

sudo systemctl restart apache2

内容的提问来源于stack exchange,提问作者Ramisha Mukhtar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 11:32:02