如何仅使用 htaccess 和 apache 将 /page 重写为 /xx/page?

如何仅使用 htaccess 和 apache 将 /page 重写为 /xx/page?

想象一下三步跳跃运动,前两步完美到位,第三步腾空而起,永不回头,最终坠落!这就是这个问题的本质 :)

步骤 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]

相关内容