Docker容器内的Apache无法识别自定义路由,访问子路由返回404错误求助
Docker容器内的Apache无法识别自定义路由,访问子路由返回404错误求助
兄弟,我之前也碰到过完全一样的问题!你的根路由能正常访问说明Apache和Laravel的基础配置没问题,但子路由报Apache层面的404,核心原因就是Apache没启用URL重写模块,或者没有正确配置让Laravel的路由规则生效——毕竟Laravel是单入口应用,所有请求都得转发到public/index.php,Apache默认不会这么做,它会直接找neighbours这个物理文件,找不到就返回404了。
给你几个具体的解决步骤,亲测有效:
1. 确保Docker里的Apache开启了rewrite模块
如果用的是官方的httpd镜像,你需要在Dockerfile里添加开启模块的命令:
FROM httpd:2.4 # 启用rewrite模块 RUN a2enmod rewrite # 复制你的Laravel项目到容器(假设本地项目在当前目录,复制到容器的/var/www/html) COPY . /var/www/html # 复制自定义的Apache配置文件(如果有的话) COPY ./my-httpd.conf /usr/local/apache2/conf/httpd.conf
2. 配置Apache允许.htaccess生效
Laravel的public目录下自带了.htaccess文件,用来处理路由重写,但Apache默认不允许目录下的.htaccess覆盖全局配置。你需要在Apache的配置文件(比如httpd.conf或者虚拟主机配置)里添加这段配置:
<Directory /var/www/html/public> # 允许.htaccess覆盖配置 AllowOverride All Require all granted </Directory> # 还要确保DocumentRoot指向Laravel的public目录 DocumentRoot /var/www/html/public ServerName zms.test
注意这里的路径要和你容器里Laravel项目的路径对应,别写错了!
3. 确认public目录下的.htaccess文件正确
如果你的项目里这个文件丢了或者内容不对,也会出问题,标准的Laravel .htaccess内容应该是这样的:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理Authorization头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 移除尾部斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 所有非文件/目录的请求转发到index.php RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
4. 重启容器
修改完Dockerfile和配置文件后,重新构建镜像并启动容器:
docker build -t my-laravel-apache . docker run -d -p 80:80 --name laravel-app my-laravel-apache
做完这些步骤,再访问zms.test/neighbours应该就能正常进入Laravel的路由处理了,不会再报Apache的404啦!
备注:内容来源于stack exchange,提问作者Kostya Bronshteyn
相关产品推荐
相关产品推荐

