You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel public目录跳转404问题(.htaccess语言检测失效)

问题修复方案

你的问题源于规则执行顺序和重写逻辑冲突:原配置先添加language查询参数再重写到/public,导致重写后的请求无法触发语言规则,同时路径映射错误引发404。以下是修正后的配置及说明:

修改后的.htaccess配置

SetEnv DEFAULT_LANG en

<IfModule mod_rewrite.c>
    Options +FollowSymLinks -Indexes

    RewriteEngine On

    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # 优先将请求重定向到public目录,记录原始请求路径
    RewriteCond %{REQUEST_URI} !^/public
    RewriteRule ^(.*)$ /public/$1 [L,E=ORIGINAL_URI:$1]

    # 从子域名提取语言代码
    RewriteCond %{HTTP_HOST} ^([a-z]{2})\.([a-z0-9-]+\.[a-z]+)$ [NC]
    RewriteRule .* - [QSA,E=LANGUAGE:%1]

    # 给未匹配到语言的请求设置默认值
    RewriteCond %{ENV:LANGUAGE} ^$
    RewriteRule .* - [QSA,E=LANGUAGE:%{ENV:DEFAULT_LANG}]

    # 给缺少language参数的请求自动添加参数
    RewriteCond %{QUERY_STRING} !language=
    RewriteRule ^public/(.*)$ /public/$1?language=%{ENV:LANGUAGE} [QSA,L]
</IfModule>

关键修改说明

  • 调整规则顺序:先完成路径重写到/public,再处理语言参数,确保语言逻辑针对最终请求生效
  • 记录原始URI:通过E=ORIGINAL_URI:$1保留原始请求路径,避免重写后丢失关键信息
  • 精准匹配路径:仅对/public开头的请求添加language参数,避免循环重写
  • 移除强制跳转(可选):若无需在地址栏显示language参数,可保持当前配置;若需要用户可见,可添加R=301标志

额外注意事项

  • 确认public目录存在且拥有正确的文件读写权限
  • 若public目录下有框架自带的.htaccess(如Laravel、Symfony),需确保其不会覆盖当前的环境变量或重写规则
  • 可在PHP代码中通过getenv('LANGUAGE')打印变量,验证语言参数是否正确传递

内容的提问来源于stack exchange,提问作者Özgür Can Karagöz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:15:00