Laravel项目.htaccess配置:如何将指定路径重定向到用户名二级域名
.htaccess 路径重定向到子域名实现方案
前置配置(必须完成否则规则不生效)
- 开启Apache重写模块:编辑httpd.conf,取消
LoadModule rewrite_module modules/mod_rewrite.so前的注释 - 允许.htaccess生效:找到站点对应
配置段,将 AllowOverride None修改为AllowOverride All - 本地泛域名解析:修改hosts文件(Windows路径:
C:\Windows\System32\drivers\etc\hosts,macOS/Linux路径:/etc/hosts),添加记录127.0.0.1 *.localhost,确保所有子域名都能指向本地服务
注意:测试重定向规则前请清空浏览器缓存,避免301永久重定向的缓存影响测试结果,测试阶段可先使用302临时重定向验证。
重定向规则配置
将以下规则写入localhost站点根目录的.htaccess文件即可实现需求:
RewriteEngine On # 匹配原路径规则,重定向到对应用户子域名 RewriteCond %{HTTP_HOST} ^localhost$ [NC] RewriteRule ^storage/([0-9]+)/public/([a-zA-Z0-9_-]+)/?$ http://$2.localhost [L,R=301,NC]
规则说明:
([0-9]+)匹配路径中的*{id}*参数,默认仅匹配数字,可根据实际id规则调整正则([a-zA-Z0-9_-]+)匹配路径中的*{username}*参数,可根据实际用户名允许的字符调整正则R=301代表永久重定向,测试阶段可替换为R=302避免浏览器缓存旧规则NC代表匹配路径时不区分大小写
重定向后原路径获取方案
如果你需要在{username}.localhost站点中获取对应的原storage/{id}/public/{username}路径,有两种常用方案:
方案1:重定向时携带参数
修改重写规则,将id作为参数传递到子域名:
RewriteEngine On RewriteCond %{HTTP_HOST} ^localhost$ [NC] RewriteRule ^storage/([0-9]+)/public/([a-zA-Z0-9_-]+)/?$ http://$2.localhost?storage_id=$1 [L,R=301,NC]
在子域名站点的业务代码中,直接读取storage_id参数即可拼接出完整的原存储路径。
方案2:内部动态映射(无感知,地址栏不变)
不需要显式重定向,直接通过Apache虚拟主机别名实现子域名到对应存储路径的内部映射,用户访问{username}.localhost时地址栏保持不变,服务端直接读取对应storage路径的资源:
- 编辑httpd.conf,取消
LoadModule vhost_alias_module modules/mod_vhost_alias.so前的注释 - 添加虚拟主机配置:
<VirtualHost *:80> ServerName *.localhost # 替换后面的路径为你本地站点根目录的绝对路径 VirtualDocumentRoot "D:/wwwroot/storage/%-2/public/%-3+" <Directory "D:/wwwroot"> AllowOverride All Require all granted </Directory> </VirtualHost>
规则中的%-3+代表取子域名的第一部分(即username),可根据你实际的存储目录结构调整映射规则,该方案不需要额外传参即可直接访问对应路径的资源。
内容的提问来源于stack exchange,提问作者Mustapha
相关产品推荐
相关产品推荐

