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
相关产品推荐
相关产品推荐

