如何为PHP多语言网站实现语言伪子目录格式的URL美化效果
实现方案
完全可以实现你需要的伪子目录格式语言URL,按以下两步操作即可:
1. 替换Apache重写规则
把你现有的.htaccess规则替换为以下内容:
Options +SymLinksIfOwnerMatch RewriteEngine on # 修正URL中的双斜杠问题 RewriteCond %{REQUEST_URI} ^(.*)//(.*)$ RewriteRule . %1/%2 [R=301,L] # 匹配语言前缀,将语言标识转为GET参数传递 RewriteRule ^(en|it)(/(.*))?$ $3?lang=$1 [L,QSA] # 隐藏.php后缀的原有逻辑 RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]
规则说明:会自动将/en/blog这类地址转为blog?lang=en,再进一步映射到blog.php,其中QSA标记会保留URL中自带的其他查询参数,不会影响原有功能。
2. PHP逻辑适配
你现有的语言检测逻辑不需要修改,重写规则会自动把语言标识赋值到$_GET['lang'],和你原有逻辑完全兼容。
如果需要避免无语言前缀的URL被访问(利于SEO统一路径),可以在$_SESSION["lang"] = $current_lang;之后添加跳转逻辑:
$request_uri = trim($_SERVER['REQUEST_URI'], '/'); // 检测路径是否已经带有合法语言前缀 if (!preg_match('#^(en|it)(/|$)#', $request_uri)) { $target = "/$current_lang/" . ($request_uri ?: ''); header("Location: $target", true, 301); exit; }
注意事项
- 后续站内生成所有链接的时候,统一加上对应的语言前缀即可
- 如果需要兼容旧的
?lang=格式的链接,可以额外添加301跳转规则,把旧路径统一跳转到新的伪子目录格式,避免重复收录问题
内容的提问来源于stack exchange,提问作者thenewbie
相关产品推荐
相关产品推荐

