Laravel 5.8如何实现目录访问跳转首页且保留文件可访问?
嘿,我刚好碰到过类似的情况,给你几个靠谱的解决方案,分别对应不同的服务器环境,保证不影响静态文件正常访问的同时,把目录URL的请求重定向到首页!
解决方案1:Apache环境(修改public/.htaccess)
Laravel默认用Apache的public/.htaccess来处理URL重写,我们只需要在现有规则前添加一段目录拦截规则即可:
打开你的项目根目录下的public/.htaccess文件,在RewriteEngine On之后、Laravel默认的重写规则之前,加入以下代码:
# 重定向存在的目录请求到首页(永久重定向) RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+)/?$ / [R=301,L]
完整的.htaccess大概是这样的:
RewriteEngine On # 新增的目录重定向规则 RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^(.+)/?$ / [R=301,L] # Laravel默认的重写规则 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
规则解释:
RewriteCond %{REQUEST_FILENAME} -d:判断当前请求的路径是否是一个真实存在的目录RewriteRule ^(.+)/?$ / [R=301,L]:如果是目录,就把任何以可选斜杠结尾的路径(比如/css或/css/)永久重定向到首页(/),L表示停止执行后续规则,避免冲突。
这样一来,访问www.mysite.test/css会直接跳转到首页,而www.mysite.test/css/app.css这类文件请求会正常返回资源。
解决方案2:Nginx环境(修改服务器配置)
如果你的项目部署在Nginx上,需要修改站点配置文件:
找到你的Nginx站点配置(通常在/etc/nginx/sites-available/目录下),添加一段专门处理目录请求的规则:
server { listen 80; server_name www.mysite.test; root /path/to/your/project/public; # 替换成你的项目public目录路径 index index.php index.html; # 拦截以斜杠结尾的目录请求,重定向到首页 location ~ ^/.+/$ { return 301 /; } # 优先处理静态文件,不存在再交给Laravel处理 location / { try_files $uri $uri/ /index.php?$query_string; } # PHP文件处理规则(根据你的PHP版本调整fastcgi_pass路径) location ~ \.php$ { fastcgi_pass unix:/var/run/php/php7.2-fpm.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name; include fastcgi_params; } }
修改完成后,重启Nginx服务生效:
sudo systemctl restart nginx
备选方案:Laravel路由方式(不推荐但应急可用)
如果你暂时无法修改服务器配置,也可以用Laravel路由来处理,但这种方式效率不如服务器层面的配置,且需要手动列出所有要处理的目录:
打开routes/web.php,添加以下路由规则:
// 匹配指定的目录请求,重定向到首页 Route::get('{dir}', function () { return redirect('/'); })->where('dir', 'css|js|fonts'); // 替换成你需要处理的所有子目录名称
注意事项:
- 用301永久重定向后,浏览器会缓存重定向规则,测试前记得清空浏览器缓存,或者先用302临时重定向(把
R=301改成R=302)测试,确认没问题再改回301。 - 确保你修改的是
public目录下的.htaccess,而不是项目根目录的那个(根目录的.htaccess是用来把请求指向public目录的)。
内容的提问来源于stack exchange,提问作者Shahrooz Yousefi Pour
相关产品推荐
相关产品推荐

