Regex 强制URL中的语言。如果URL没有语言,则根据浏览器语言重定向

Regex 强制URL中的语言。如果URL没有语言,则根据浏览器语言重定向,regex,apache,.htaccess,mod-rewrite,redirect,Regex,Apache,.htaccess,Mod Rewrite,Redirect,我刚刚翻译了我的网站。出于SEO的原因(为了避免重复内容),我希望每个URL都有它的语言。例如,www.racebooking.net/page.php必须变成www.racebooking.net/en/page.php。然后将/en/部分转换为?lang=en 此外,用户在浏览网站时必须能够选择首选语言 我试图实现的逻辑如下: 如果URL是racebooking.net/en/page.html,只需转到 page.html?lang=en无论哪种语言是我的浏览器 如果URL是racebo

我刚刚翻译了我的网站。出于SEO的原因(为了避免重复内容),我希望每个URL都有它的语言。例如,
www.racebooking.net/page.php
必须变成
www.racebooking.net/en/page.php
。然后将
/en/
部分转换为
?lang=en

此外,用户在浏览网站时必须能够选择首选语言

我试图实现的逻辑如下:

  • 如果URL是
    racebooking.net/en/page.html
    ,只需转到
    page.html?lang=en
    无论哪种语言是我的浏览器
  • 如果URL是
    racebooking.net/it/page.html
    ,只需转到
    page.html?lang=it
    无论哪种语言是我的浏览器
  • 如果URL是
    racebooking.net/page.html
    ,请检查浏览器语言。如果 意大利语,将url转换为
    racebooking.net/it/page.html
    并转到 到
    page.html?lang=it
    ,在任何其他情况下,将url转换为
    racebooking.net/en/page.html
    进入
    page.html?lang=en
这是我写的

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^$ /it/%1 [L,QSA,NC]

RewriteCond %{THE_REQUEST} !^[A-Z]{3,}\s/[en|it]{1,1}/(.*)$ [NC]
RewriteRule ^$ /en/%1 [L,QSA,NC]
但是什么也没有发生……它没有检测到
/en/
/it/
丢失!看起来第一次重写没有发生

此外,这似乎与这一规则相冲突

RewriteRule ^(en|it)\/(.*)$ $2\?lang=$1 [L,QSA,NC]
有什么想法吗

编辑 经过长时间的讨论,@anubhava解决了这个问题!他的解决方案非常有效。
因此,我对我的问题进行了编辑,以使其对访问者更有帮助。

您的正则表达式是错误的,尤其是这一部分
[en | it]
基本上与字母
e,n,|,i,t
匹配,因为它是一个字符类

请尝试以下规则:

DirectoryIndex index.php

RewriteEngine on

# always www
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# remove index.php from URL
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^(.*?)index\.php$ /$1 [L,R=301,NC,NE]

# redirect first visitors basing on their language or redirect if language not specified
# in URL. If italian, redirect to italian
# if lang is Italian use it
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^ /it%{REQUEST_URI} [L,NC,R=301]

# otherwise use English
RewriteCond %{THE_REQUEST} !\s/(it|en)/ [NC]
RewriteRule ^ /en%{REQUEST_URI} [L,NC,R=301]

# populate ?lang query parameter
RewriteRule ^(en|it)/(.*)$ $2?lang=$1 [L,QSA,NC]

我尝试了你的解决方案,但我得到了内部服务器错误!有个打字错误,我只是把它修好了。您的系统中还有其他重写规则或.htaccess吗?是的,实际上我有很多规则!你的规则看起来不错,但我仍然收到服务器错误…顺便说一句,我发现了两个可能存在冲突的规则…因为我有一个规则,可以将
/en/
的URL转换为
的URL?lang=en
这是有冲突的htaccess部分:您能看到冲突在哪里以及如何修复它吗?我可以知道最后一个规则的用途:
RewriteRule^(en | it)/(.*)$$2?lang=$1[L,QSA,NC]
?也是
/en/
/it/
真实目录?