我有一个带有 com TLD 的多语言站点,目前具有以下 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/
我尝试了两种方法:
方法 1
在 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 执行重写规则,它会显示一些内容,但所有包含的 javascript 和样式文件(*.js 和 *.css)都会产生 404 错误,因此页面已损坏。
方法 2
我没有在 example.de public_html 中进行代理重写,而是配置了域,使其 www 目录成为 example.com 中的 public_html 目录。没有别的,我在浏览器中看到了 example.de,它以(默认)英文版本显示了 example.com 中 public_html 的内容。然后我尝试在 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 实际提供给用户的? 谢谢。
你可以尝试这样的事情:
RewriteEngine On
RewriteBase /
RewriteCond %{HTTP_HOST} ^(?:www\.)?example\.com$ [NC]
RewriteRule ^(en|es|de|fr|ja|zh)(/.*)?$ "https://example.$1$2" [QSA]
这会将
https://example.com/de/page1/
类型的任何链接重定向到https://example.de/page1/
另外
https://example.com/de/
将被重定向到https://example.de/
答案是 M. Eriksson 的评论和 SelVazi 的答案的组合(感谢两者):
我删除了新的 .de、.fr、.es 域作为 *.com 域的附加域,并将它们添加为 .com 域的别名。当我在我的网站上使用 Let's Encrypt 时,这自动导致它们被包含在 .com 域的 SSL 证书中。
没有别的,我然后将以下行添加到顶部 我在 .com public_html 文件夹中的 htaccess 文件:
RewriteCond %{HTTP_HOST} ^(?:www\.)?example\.com$ [NC]
RewriteRule ^(es|de|fr)(/.*)?$ "https://example.$1$2" [QSA]
这样做的好处是所有后续重写仍然像以前一样工作,并且不需要更改使用语法
example.com/de/page1/
的内部链接。优秀的解决方案。谢谢!
为了完整起见,我应该补充一点,问题中提到的500错误的原因是
SSLProxyEngine
在服务器上被关闭了。