Laravel项目Apache部署下URL重定向404问题求助
Laravel项目Apache部署下网络共享文件夹跳转404问题
我在使用Apache服务器的Laravel项目中遇到以下问题:
- 代码中通过
$directory = "\\fileserver\public\office\technology";和scandir($directory);访问网络共享文件夹,生成的链接/office/technology显示正常,但点击跳转时出现Apache 404错误。 - 已启用mod_rewrite模块,用
php artisan serve运行项目时一切正常,怀疑是.htaccess或httpd-vhosts.conf配置错误,附上两个配置文件内容:
.htaccess 配置
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
httpd-vhosts.conf 配置
<VirtualHost *:80> ServerName test.vr.it DocumentRoot "C:/xampp/htdocs/intranet/public" ErrorLog "logs/test.vr.it-error.log" <Directory "C:/xampp/htdocs/intranet/public"> Options FollowSymLinks AllowOverride All Require all granted </Directory> </VirtualHost>
解决方案
1. 问题根源
php artisan serve作为PHP内置服务器,会把所有请求直接交给Laravel路由处理;但Apache会优先检查请求路径是否为本地存在的文件/目录。当点击/office/technology时,Apache会去项目public目录下查找对应文件夹,找不到就直接返回404,不会转发给Laravel处理。
2. 调整Apache配置,让共享路径请求交给Laravel
方法一:修改.htaccess
在现有Rewrite规则前,添加规则指定/office/technology路径直接转发给Laravel:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 新增规则:将/office/technology相关请求交给Laravel处理 RewriteRule ^office/technology(.*)$ index.php [L] # Handle Authorization Header RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # Redirect Trailing Slashes If Not A Folder... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # Send Requests To Front Controller... RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
方法二:修改httpd-vhosts.conf
在VirtualHost的Directory块中添加FallbackResource,让所有不存在的路径都转发给Laravel:
<VirtualHost *:80> ServerName test.vr.it DocumentRoot "C:/xampp/htdocs/intranet/public" ErrorLog "logs/test.vr.it-error.log" <Directory "C:/xampp/htdocs/intranet/public"> Options FollowSymLinks AllowOverride All Require all granted # 新增:所有不存在的请求转发到index.php FallbackResource index.php </Directory> </VirtualHost>
3. 补全Laravel路由处理
在routes/web.php中添加对应路由,确保请求能被Laravel正确处理:
Route::get('/office/technology', function () { // 注意:网络路径需要双反斜杠转义 $directory = "\\\\fileserver\\public\\office\\technology"; $files = scandir($directory); return view('office.technology', compact('files')); });
4. 验证配置
修改完成后重启Apache服务器,清除浏览器缓存,再测试跳转是否正常。
内容的提问来源于stack exchange,提问作者Cressi
相关产品推荐
相关产品推荐

