想象一下三步跳跃运动,前两步完美到位,第三步腾空而起,永不回头,最终坠落!这就是这个问题的本质 :)
步骤 1:工作/somepage?ln=xx
当用户导航到 时提供服务/xx/somepage
。
# if user inputs nice urls /xx/somepage to serve page /someapge?ln=xx
RewriteRule ^([a-z][a-z])/(.*) /$2?ln=$1 [L]
步骤 2:工作仅指定语言时转到主页 /xx/
# if language xx given but no page given? then redirect to its home /xx/home
RewriteRule ^([a-z][a-z])/?$ /$1/home [R=301,L]
步骤 3:崩溃
# if user inputs /somepage then redirect to default english: /en/somepage
# if user inputs /somepage?ln=xx redirect to nice url /xx/somepage
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en/$1 [R=301,L]
第三条规则是我们陷入困境的地方……PS:重定向应该适用于无扩展名的文件某些页面?ln=xx以及扩展名为某些页面.abc?ln=xx扩展名可以是任何 2 或 3 个字符的单词,或者如果更简单,可以使用以下扩展名手动检查我使用的 [.php .uu .u3c .vls]
非常感谢!
答案1
这确实有效(已测试):
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en$1 [R=301,L]
阿帕奇Mod_Rewrite 文档,重写指南, 和高级重写指南。
编辑:
测试了以上内容(与以前相同);在我的 Apache 2.2 服务器上运行。
编辑2:
应该没问题,只需要这样的东西:
# If just the language is specified (ie example.com/en)
RewriteCond %{REQUEST_URI} ^/..$ [NC]
RewriteRule ^(.*)$ $1/
# If no language subfolder, default to 'en'
RewriteCond %{REQUEST_URI} !^/../ [NC]
RewriteRule ^(.*)$ /en$1 [R=301]
# If no page specified, default to home.
RewriteCond %{REQUEST_URI} !^/../.+ [NC]
RewriteRule ^/(..) /$1/home.html [R=301]
# If no ln query, tack it on
RewriteCond %{QUERY_STRING} !ln= [NC]
RewriteRule ^/(..)/(.*) /$1/$2?ln=$1 [R=301]
注意:请确保您的 404 页面正常工作。如果不正确,无效链接将陷入无限循环(即 404 页面将无法工作)。
注意 2:如果用户输入example.com/en
,他们将被重定向到example.com/en/en?ln=en
,因此请确保 URL 中有结尾的斜杠,否则。
注意 3:如果您愿意,可以[R=301]
从最后一条规则中删除,然后用户将看到example.com/en/home.html
对该页面的请求实际上是example.com/en/home.html?ln=en
。但是,如果您的网站使用 GET 请求,这将不起作用。
编辑3:
添加另一个条件/规则对来捕获是否有人只输入了语言而没有尾随斜杠。
答案2
这是我使用的代码。它可以接受任何语言和国家。
# Tout pays de 2 digits et langue de 2 ou 3 digits ou juste la langue pas de pays - fonctionne bien et passe language et country
#www.country.com/index.html devient www.country.com/index.php
#www.country.com/fr/index.html devient www.country.com/index.php?language=fr
#www.country.com/ca/fr/index.html devient www.country.com/index.php?country=ca&language=fr
RewriteRule ^([a-zA-Z]{2})/([a-zA-Z]{2,3})/index\.html$ index.html?country=$1&language=$2
RewriteRule ^([a-zA-Z]{2,3})/index\.html$ index.html?language=$1
RewriteRule ^index\.html$ /index.php [L]