通过 htaccess 在同一服务器上静默重写其他 TLD

问题描述 投票:0回答:2

我有一个带有 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 实际提供给用户的? 谢谢。

php apache .htaccess url-rewriting
2个回答
1
投票

你可以尝试这样的事情:

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/


1
投票

答案是 M. Eriksson 的评论和 SelVazi 的答案的组合(感谢两者):

  1. 我删除了新的 .de、.fr、.es 域作为 *.com 域的附加域,并将它们添加为 .com 域的别名。当我在我的网站上使用 Let's Encrypt 时,这自动导致它们被包含在 .com 域的 SSL 证书中。

  2. 没有别的,我然后将以下行添加到顶部 我在 .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
在服务器上被关闭了。

© www.soinside.com 2019 - 2024. All rights reserved.