Laravel7使用.htaccess排除指定目录被路由拦截问题求助
Laravel 7路由排除特定目录问题及解决方案
问题背景
需要在Laravel 7的路由规则中排除一个特定目录,初始服务器目录结构如下:
/var/www/myproject.local /var/www/dir_to_exclude
可根据需求将dir_to_exclude移动到Laravel根文件夹内。
最初使用网上找到的.htaccess配置未生效,访问被排除目录下的文件时始终返回Laravel 404页面,配置内容如下:
<IfModule mod_rewrite.c> Options -MultiViews RewriteEngine On RewriteBase / RewriteRule ^(dir_to_exclude) - [L] RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.+)/$ http://%{HTTP_HOST}/$1 [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L] </IfModule>
服务器host文件配置:
IP_ADDESS myproject.local myproject
主机名显示为myproject。
调整尝试
删除项目根目录下的.htaccess,修改public目录下的.htaccess规则,新增目录排除逻辑:
<IfModule mod_rewrite.c> <IfModule mod_negotiation.c> Options -MultiViews -Indexes </IfModule> RewriteEngine On # 处理授权头 RewriteCond %{HTTP:Authorization} . RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}] # 排除目标目录重写 RewriteRule ^dir_to_exclude($|/) - [L] # 非目录路径去除末尾斜杠 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_URI} (.+)/$ RewriteRule ^ %1 [L,R=301] # 所有请求转发到前端控制器 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^ index.php [L]
此时项目结构如下:
/var/www/myproject |- dir_to_exclude |-- info.php |- public |-- .htaccess
访问http://www.myproject.local/dir_to_exclude/info.php时返回Apache原生404页面,仍未达到预期。
附带虚拟主机配置:
<VirtualHost *:80> <Directory /var/www/myproject> Options FollowSymLinks AllowOverride All </Directory> DocumentRoot /var/www/myproject ServerName www.myproject.local ErrorLog /var/log/myproject.log LogLevel debug CustomLog /var/log/access.log combined </VirtualHost>
最终解决方法
在/public文件夹内创建指向目标目录的软链接,即可正常访问目录下的文件,满足使用需求。
内容的提问来源于stack exchange,提问作者Simone Conti
相关产品推荐
相关产品推荐

