我有一个多语言的网站与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实际上是服务于用户?谢谢。
2条答案
按热度按时间dgsult0t1#
你可以试试这样的方法:
这会将类型为
https://example.com/de/page1/
的任何链接重定向到https://example.de/page1/
此外,
https://example.com/de/
将重定向到https://example.de/
dl5txlt92#
答案是埃里克森的评论和塞尔瓦齐的回答的结合(感谢两者):
1.我删除了新的.de,.fr,.es域名作为 *.com域名的附加域名,并将它们添加为.com域名的别名。当我在我的网站上使用Let's Encrypt时,这会自动导致它们被包含在.com域名的SSL证书中。
1.然后,我在.com public_html文件夹中的htaccess文件顶部添加了以下代码行:
这样做的好处是所有后续的重写仍然像以前一样工作,并且使用语法
example.com/de/page1/
的内部链接都不需要更改。优秀的解决方案。谢谢!为了完整起见,我应该补充一点,问题中提到的500错误的原因是
SSLProxyEngine
在服务器上关闭了。