多种语言 + Htaccess

Posted

技术标签:

【中文标题】多种语言 + Htaccess【英文标题】:Multiple languages + Htaccess 【发布时间】:2018-03-16 09:16:17 【问题描述】:

我需要一个域来管理语言 (en/it/pt/es) 并删除 www。并强制 https

重写引擎开启 # -> www.example.com 到 example.com RewriteCond %HTTP_HOST www.example.com 重写规则 (.*) http://example.com/$1 [L,R=301] # -> http -> https RewriteCond %SERVER_PORT 80 RewriteRule (.*) https://%HTTP_HOST%REQUEST_URI [L,R=301]

我不知道如何制定这个重写规则: index.php?lg=es -> /es/ 而不是 /es 或 /es.php 甚至拒绝 index.php?lg=es

重写规则 ^([a-zA-Z0-9]+)/?$ index.php?lg=$1

??

搜索引擎优化对我的网站不利,引擎只知道英语,其他语言在结果的第 4 页。

这是因为我有两种显示网址的原因吗??

example.com/it/ 和 example.com/it 不应返回同一页面

感谢您的帮助。

编辑(我认为一切都是正确的??):10 月 7 日,感谢所有回答:

重写引擎开启 RewriteCond %HTTP_HOST ^www.example.com$ [OR] RewriteCond %SERVER_PORT 80 [或] RewriteCond %HTTPS 关闭 重写规则 ^(.*)$ https://example.com/$1 [R=301,L] 重写规则 ^/?([a-z]2)$ /$1/ [R=301,NC,L] 重写规则 ^/?([a-z]2)/$ /index.php?lg=$1 [NC] 重写条件 %ENV:REDIRECT_STATUS ^$ RewriteCond %REQUEST_URI ^/?index.php$ RewriteCond %QUERY_STRING ^lg=([^&]+)(&.*)?$ 重写规则 ^/?index.php$ - [F] 错误文档 404 /404.php

只是一个问题:测试 https 关闭是否真的有用(连接速度慢?)?谢谢

2018 年 2 月 8 日编辑

使用几个月后,出现很多 404 错误。 Htaccess 需要更加简化

我只需要:

 1) www -> non-www
 2) http -> https
 3) index.php -> example.com
 4) redirect index.php?lg=it and index.php?lg=es and index.php?lg=pt 
    to example.com/it or to example.com/es or to example.com/pt

如果它不是这种语言中的一种 -> 转到主页 example.com 或 404 ??但是谷歌站长会增加404错误...

我需要一个非常简化的 htaccess 版本,其中包含 3 种语言和 Rewrite Base 吗?或不 ?

这是我的 htaccess :

RewriteEngine On
RewriteCond %HTTP_HOST ^www.example.com$ [OR]
RewriteCond %SERVER_PORT 80 [OR]
RewriteCond %HTTPS off
RewriteRule ^(.*)$ https://example.com/$1 [R=301,L]
RewriteRule ^/?([a-z]2)$ /$1/ [R=301,NC,L]
RewriteRule ^/?([a-z]2)/$ /index.php?lg=$1 [NC]
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteCond %REQUEST_URI ^/?index.php$
RewriteCond %QUERY_STRING ^lg=([^&]+)(&.*)?$
RewriteRule ^/?index.php$ - [F]
ErrorDocument 404 /404.php

一切都在 index.php 中管理,创建 3 个页面会更好吗?

index.php -> 重定向到 example.com

es.php -> 重定向到 example.com/es

it.php -> 重定向到 example.com/it 删除 .php

有人能做到吗?谢谢

【问题讨论】:

我们无法告诉您您的 SEO 很糟糕。有很多可能的原因,因此这里讨论它的地方是错误的。 如果我们有一个像 example.com/it/some-page 这样的 URL 会发生什么......并且 example.com/it/ 和 example.com/it 应该提供相同的页面恕我直言,如果不请解释原因 感谢您的回复,我认为 example.com/it/ 和 example.com/it 可能被视为重复内容?在许多网站上 /it 重定向到 /it/ 你只在硬代码域中使用了我的答案... 是的,我使用您的代码,但我需要更多积分(声誉)才能投票,所以我不能抱歉.. 【参考方案1】:

这个解决方案很好,因为可以应用于任何域(没有硬代码名称)。

一些注意事项:

    删除 www. (没有硬编码域名) 强制 https(在开发环境中您可以使用 http) 始终添加斜线 如果未指定页面名称,请定义默认主页 将语言和页面从 URL 映射到(内部)查询字符串

请注意,4 和 5 在 public/ 文件夹中有 index.php 文件...如果需要,可以更改或删除它。


# ###############################################################################
# | Rewrite engine  (SEO URLs friendly)                                            |
# ###############################################################################
<IfModule mod_rewrite.c>

    RewriteEngine On
    Options +FollowSymlinks

    ## Process pages requests

  # 1. To redirect from www to non www (Rewrite www.example.com → example.com)
    RewriteCond %HTTP_HOST ^www\.(.+) [NC]
    RewriteRule ^(.*) https://%1/$1 [R=301,NE,L]

  # 2. Redirect HTTP to HTTPS automatically (only if not in localhost)
    RewriteCond %HTTP_HOST !=localhost
    RewriteCond %HTTPS off
    RewriteRule ^(.*)$ https://%HTTP_HOST%REQUEST_URI [L,R=301]

  # 3. (Add a slash) aa → aa/
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^([^./]+)$ $1/

  # 4. (Default homepage) aa/ → ?lang=aa&page=home
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^([^./]+)/$ public/index.php?lang=$1&page=home

  # 5. (Language and page) aa/bb → ?lang=aa&page=bb
    RewriteCond %REQUEST_FILENAME !-f
    RewriteCond %REQUEST_FILENAME !-d
    RewriteRule ^([^./]+)/([^./]+)$ public/index.php?lang=$1&page=$2

</IfModule>
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

【讨论】:

是的,你是对的,但如果你有 http://www. example.com 最终会出现 2 次重定向,首先是从非 www 到 www,然后是从 http 到 https。 感谢代码:但主页 example.com 不起作用:无法连接,可能是循环...当我更改您的代码时,我无法显示主页但 /es/ 不是添加的 /es/ 和 /es 是一样的,我真的需要重定向 /es -> /es/ like dafont.com/es -> dafont.com/es/ 使它(这不是我的网站)。谢谢。跨度> 【参考方案2】:

这应该对你有用:

RewriteEngine On
# redirect to none-www and https
# if host do not starts with www.
RewriteCond %HTTP_HOST ^www\.(([A-Za-z0-9][A-Za-z0-9-]+\.)+[A-Za-z]2,)$ [OR]
# or if Port is 80
RewriteCond %SERVER_PORT 80 [OR]
# or if https is off
RewriteCond %HTTPS off
# redirect to example.com with https
RewriteRule ^(.*)$ https://%1/$1 [R=301,L]

# Redirect Language Strings without Trailing Slashes 
RewriteRule ^/?([a-z]2)$ /$1/ [R=301,NC,L]

# Rewrite Language string
RewriteRule ^/?([a-z]2)/$ /index.php?lg=$1 [NC]

# Prevent direct access to /index.php?lg=$1 [QSA,NC,L]
RewriteCond %ENV:REDIRECT_STATUS ^$
RewriteCond %REQUEST_URI ^/?index.php$
RewriteCond %QUERY_STRING ^lg=([^&]+)(&.*)?$
RewriteRule ^/?index.php$ - [F]

我在 Ubuntu 16.04.03 LTS 和 Apache 2.4.27 上测试了这个结果

【讨论】:

感谢您的简化。只有最后一个重写条件不起作用。 Forbidden :您无权访问此服务器上的 /index.php。我仍然需要强制 /lg 到 /lg/ 是否正确? : RewriteRule ^(en|it|pt|esp)\/?$ index.php?lg=$1 [QSA,NC,L] 和 example.com/lg/text 不可能只是 example.com/lg/ 好的,我已经进行了多次测试,但它不起作用:一些规则可以 www-> 非 www , http -> https ,但是 example.com/es/ -> 404 错误,例如。 com/es -> 仍然没有重定向到 example.com/es/ 这不是我的网站,但我想要类似 dafont.com/es -> www.dafont.com/es/ (总是添加斜线) www.dafont.com /es.php -> 404 。我只需要 2 个字母 index.php?lg=es 而不是 index.php?lg=es&p=home 所以通常只需 1 美元。重定向 index.php?lg=es -> /es/ 即使添加了更多参数。再次感谢 好的,我知道缓存需要被擦除 :) 我做了一点混合,现在它可以工作了:/it -> 重定向到 /it/ -> 很酷并且 index.php?lg =it -> 您无权访问此服务器上的 /index.php。您的代码的开头导致主页出错,所以这里是所有代码:请参阅我的第一篇文章在顶部 好的,我尝试为您的解决方案投票,但我需要更多积分(声誉)才能投票,所以我不能抱歉...

以上是关于多种语言 + Htaccess的主要内容,如果未能解决你的问题,请参考以下文章

处理多种语言的 UITextField

Laravel同时显示多种语言验证错误

初学编程选哪门编程语言?真的有必要掌握多种语言吗?

如何在三星商店添加多种语言?

·介绍一些多种语言翻唱的歌(好的话附加50分)

多种语言 + Htaccess