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

qlzsbp2j  于 2023-03-19  发布在  其他
关注(0)|答案(2)|浏览(155)

我有一个多语言的网站与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/
我尝试了2种方法:

途径1

在www.example.com public_html文件夹中的.htaccess文件中example.de,我放入:

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

我没有在www.example.com public_html中执行代理重写example.de,而是配置了域,使其www目录为example.com中的public_html目录。在没有其他内容的情况下,我example.de在浏览器中看到www.example.com,并且它在example.com(默认)英语版本。然后我尝试添加一些重写规则到example.com中的htaccess文件,以将www.example.comMapexample.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的Angular 来看,哪一种方法更可取?
另外,我还没有能够测试它,因为它目前不工作,像这样的东西会如何影响我的SSL证书?即,将应用哪个证书?www.example.com的一个example.de(显示在用户地址栏)或www.example.com的一个example.com实际上是服务于用户?谢谢。

dgsult0t

dgsult0t1#

你可以试试这样的方法:

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/

dl5txlt9

dl5txlt92#

答案是埃里克森的评论和塞尔瓦齐的回答的结合(感谢两者):
1.我删除了新的.de,.fr,.es域名作为 *.com域名的附加域名,并将它们添加为.com域名的别名。当我在我的网站上使用Let's Encrypt时,这会自动导致它们被包含在.com域名的SSL证书中。
1.然后,我在.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在服务器上关闭了。

相关问题