通过.htaccess实现同服务器其他TLD的静默重写问题求助
背景
我有一个基于.com顶级域名的多语言站点,当前使用以下.htaccess规则:
首页规则
RewriteRule ^/?(en|es|de|fr|ja|zh)/$ ?lang=$1&%{QUERY_STRING} [L]
子页面规则
RewriteRule ^/?(en|es|de|fr|ja|zh)/([1-9a-z-]{3,})/$ $2.php?lang=$1&%{QUERY_STRING} [L]
该规则运行正常:用户访问https://example.com/de/page1/时,会被静默转换为https://example.com/page1.php?lang=de。
现在我购入了example.de、example.fr、example.es域名,均部署在同一服务器上,希望将访问结构改为展示https://example.de/page1/而非https://example.com/de/page1/。
我尝试了两种方案:
方案一
在example.de的public_html目录下的.htaccess文件中添加:
RewriteEngine On RewriteCond %{HTTP_HOST} ^example\.de$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.de$ RewriteRule ^(.*)$ "https\:\/\/example\.com\/de\/$1" [P,QSA]
但出现500错误(Apache已启用mod_proxy;由于使用托管服务器,无法查看Apache错误日志,仅public_html下的error_log无内容)。若将重写规则改为http而非https,页面可显示,但所有js、css文件出现404错误,页面损坏。
方案二
未在example.de的public_html中配置代理重写,而是将该域名的www目录指向example.com的public_html目录。未添加其他规则时,浏览器显示example.de并展示example.com的默认英文内容。随后我尝试在example.com的.htaccess中添加规则映射example.de到对应语言:
RewriteCond %{HTTP_HOST} ^example\.de$ [OR] RewriteCond %{HTTP_HOST} ^www\.example\.de$ RewriteRule ^(.*)$ /de/$1 [L,QSA]
同样出现500错误。若使用完整URI https://example.com/de/$1作为重写目标,规则生效但无法实现静默重写。
我的问题
- 两种方案分别存在什么问题?从安全和SEO角度看哪种方案更优?
- 该配置会对SSL证书产生什么影响?浏览器地址栏显示的
example.de证书还是实际提供内容的example.com证书?
1. 两种方案的问题分析及优劣对比
方案一的问题
- 500错误原因:仅启用
mod_proxy不足以支持HTTPS代理,还需要开启mod_proxy_http和mod_proxy_https模块;另外规则中多余的转义字符(引号、斜杠)会导致Apache解析错误,正确写法应为https://example.com/de/$1。 - HTTP模式下静态资源404:页面中的js、css若为相对路径或指向
example.com的绝对路径,代理后浏览器地址栏是example.de,资源请求会发往example.de对应路径,但资源实际存储在example.com,因此出现404。
方案二的问题
- 500错误原因:规则触发无限循环重写。用户访问
example.de/page1/时,规则将路径重写为/de/page1/,而原站点的多语言规则会再次匹配该路径,之后新请求又会触发主机判断规则,Apache检测到循环后返回500错误。 - 完整URI导致跳转:使用外部完整URI时,Apache默认会发起302跳转,无法实现静默重写效果。
安全与SEO优劣对比
- 安全角度:方案二更优。方案一的代理模式若服务器配置不当,可能存在被滥用转发第三方内容的风险;方案二是同目录部署,权限控制更简单,减少代理带来的安全隐患。
- SEO角度:方案二更符合搜索引擎对多语言站点的规范(独立域名对应独立语言版本),避免了代理转发可能带来的内容抓取延迟或解析问题,也更便于设置各域名的独立站点标识。
2. SSL证书的影响
- 方案一代理模式:浏览器地址栏显示
example.de,但实际从example.com获取内容,此时必须为example.de配置独立SSL证书,否则会因证书域名不匹配触发浏览器安全提示。 - 方案二同目录部署:直接为
example.de部署SSL证书即可,浏览器地址栏显示的证书与域名完全匹配,不会出现安全提示。
内容的提问来源于stack exchange,提问作者user10425889

