Regex 重定向到除/amp/URL之外的默认语言

Regex 重定向到除/amp/URL之外的默认语言,regex,.htaccess,url-rewriting,Regex,.htaccess,Url Rewriting,我正在努力解决重定向问题,但没有成功 我更改了我的站点的URL,强制使用默认语言,以前是site.com/help/,现在是site.com/en/help/。多亏了堆栈溢出的帮助,我进行了重定向,但随后我遇到了AMP页面的新问题:site.com/AMP/help/现在被重定向到site.com/en/AMP/help/,而它们应该是site.com/AMP/en/help/ 再次感谢这个站点上的帮助,我将URL的结构更改为site.com/en/help/amp/(amp始终位于末尾)。为了

我正在努力解决重定向问题,但没有成功

我更改了我的站点的URL,强制使用默认语言,以前是site.com/help/,现在是
site.com/en/help/
。多亏了堆栈溢出的帮助,我进行了重定向,但随后我遇到了AMP页面的新问题:
site.com/AMP/help/
现在被重定向到
site.com/en/AMP/help/
,而它们应该是
site.com/AMP/en/help/

再次感谢这个站点上的帮助,我将URL的结构更改为
site.com/en/help/amp/
(amp始终位于末尾)。为了实现这一点,我不得不删除一些页面中的.php扩展名,并决定删除后面的斜杠

我现在面临两个新问题:301重定向到非.php页面和带有尾随斜杠的URL到非尾随斜杠不起作用。下面是我的htaccess代码

RewriteEngine on

# amp
RewriteRule ^(.*/)?amp/(.+?)/?$ /$1$2/amp [R=301,NC,L]

## redirect to default language (fr)
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_URI} !/inc
RewriteCond %{REQUEST_URI} !/ajax/
RewriteCond %{REQUEST_URI} !/img/
RewriteRule ^(?![a-z]{2}(?:[/-]|$))(.*)$ /fr/$1 [R=301,L,NE]

## Unless directory, remove trailing slash
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/$ /$1 [R=301,NE,L]

## add trailing slash in front of directories
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^[a-z]{2}(?:-[a-z]{2})?/(.+)$ /$1/ [L]

# remove .php
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_FILENAME} !global.js
RewriteCond %{REQUEST_URI} !/ajax/
RewriteCond %{REQUEST_URI} !results.php
RewriteRule ^(.+)\.php(.*)$ /$1$2 [R=301,NC,NE,L]

## amp pages
RewriteRule ^(.*)/amp$ /$1?amp=1 [NC,QSA,L]

## folders of languages
#RewriteRule ^([a-z]{2}(?:-[a-z]{2})?)/(.*)$ /$2?lang=$1 [QSA,L]
RewriteRule ^([a-z]{2}|[a-z]{2}-[a-z]{2})$ /$2?lang=$1 [QSA,L]
RewriteRule ^([a-z]{2}|[a-z]{2}-[a-z]{2})/(.*)$ /$2?lang=$1 [QSA,L]

## hide .php extention
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_FILENAME} !global.js
RewriteRule ^(.+?)/?$ $1.php [L]
这样做:

RewriteEngine on

# changed amp URLs
RewriteRule ^(.*/)?amp/(.+?)/?$ /$1$2/amp/ [R=301,NC,L]

## redirect to default language (en)
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_URI} !/img/
RewriteRule ^(?![a-z]{2}(?:[/-]|$))(.*)$ /en/$1 [R=301,L,NE]

## Unless directory, remove trailing slash
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !/amp/$ [NC]
RewriteRule ^(.+)/$ /$1 [R=301,NE,L]

## add trailing slash in front of directories after lang rewrite
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^[a-z]{2}(?:-[a-z]{2})?/(.+[^/])$ /$0/ [L]

# remove .php
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(.+)\.php$ /$1/ [R=301,NC,NE,L]

## amp pages
RewriteRule ^(.+/)amp/?$ /$1?amp=1 [NC,QSA,L]

## folders of languages
RewriteRule ^([a-z]{2}(?:-[a-z]{2})?)/(.*)$ /$2?lang=$1 [QSA,L]

## hide .php extention
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_FILENAME} !global.js
RewriteRule ^(.+?)/?$ $1.php [L]
此尾随斜杠规则的解释:

## add trailing slash in front of directories after lang rewrite
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^[a-z]{2}(?:-[a-z]{2})?/(.+[^/])$ /$0/ [L]
以URI为例:
/fr/cart

在后面的规则中,我们从URL中删除
lang
组件,并将其作为
lang=
查询参数传递。
lang
参数后面的部分,例如
/cart
没有尾随斜杠,如果它是真实目录,则Apache的
/cart?lang=fr
模块将重定向到
/cart/?lang=fr
,并且您的内部URL将在浏览器中显示


因此,在当前规则中,我们捕获
lang
组件之后的部分,并检查是否没有尾随斜杠,并且它是一个目录,然后该规则在内部用尾随斜杠重写为
/fr/cart/
。后来的规则将其重写为
/cart/?lang=fr
,而
mod_dir
不再重定向。

@anubhava的解决方案工作得很好,除了一个小例子:
/fr/amp/page.php
重定向到
/fr/page.php/amp
,我不得不对代码进行一些更改,并设法使其正常工作。下面是我做了一些小改动后更新的代码:

1-删除了一些规则末尾的斜杠,因为我不再需要它们了

2-删除此规则
RewriteCond%{REQUEST_URI}/amp/$[NC]

3-为了解决.php问题,我将
RewriteRule^(+.+)\.php$/$1/[R=301,NC,NE,L]
替换为
RewriteRule^(+.+)\.php(.*)$/$1$2[R=301,NC,NE,L]

RewriteEngine on

## changed amp URLs
RewriteRule ^(.*/)?amp/(.+?)/?$ /$1$2/amp [R=301,NC,L]

## redirect to default language (en)
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_URI} !/img/
RewriteRule ^(?![a-z]{2}(?:[/-]|$))(.*)$ /en/$1 [R=301,L,NE]

## Unless directory, remove trailing slash
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)/$ /$1 [R=301,NE,L]

## add trailing slash in front of directories
RewriteCond %{DOCUMENT_ROOT}/$1 -d
RewriteRule ^[a-z]{2}(?:-[a-z]{2})?/(.+)$ /$1/ [L]

# remove .php
RewriteCond %{ENV:REDIRECT_STATUS} !200
RewriteRule ^(.+)\.php(.*)$ /$1$2 [R=301,NC,NE,L]

## amp pages
RewriteRule ^(.+/)amp$ /$1?amp=1 [NC,QSA,L]

## folders of languages
RewriteRule ^([a-z]{2}(?:-[a-z]{2})?)/(.*)$ /$2?lang=$1 [QSA,L]

## hide .php extention
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{REQUEST_FILENAME} !global.js
RewriteRule ^(.+?)/?$ $1.php [L]

在根目录中。实际上我没有任何amp目录我们刚刚决定让/amp成为amp页面和所有语言的根目录,你会怎么做呢?好的,我现在想换一种方式,你觉得site.com/en/help/amp/(amp/)怎么样总是在结尾,只是尝试使用一个简单的约定:)所以我会选择
site.com/en/help/amp/
我认为最好的:)好的,我会这样做,并会让你知道:)再次感谢你的建议:)谢谢你的代码。我已经试过了,但效果不好:当我转到site.com/es时,它会重定向到.com/en/es:(现在有一个新问题:如果我键入/en/cart/,它会导致太多时间重定向:/en/cart?lang=en&lang=en&lang=en&lang=en&lang=en……当然,我为testsOK清除了浏览器缓存,我注意到如果文件夹“cart”存在,这是我的情况,发生了太多的重定向,但如果我键入
/cartt
,它会将我重定向到
/en/cartt
,很抱歉,只是忘了更改:)谢谢您在编辑的消息中的解释。现在我更清楚了:)祝你有一个美好的一天,再次感谢allhi@anubhava,希望你做得很好,很抱歉打扰你,你一直是我的救世主,我发布了一个问题,但没有人能给我一个有效的解决方案,你能看看这篇帖子吗:?非常感谢您根据其他人的答案编写了一个工作示例,这可能对其他读者有所帮助。然而,这里的一些要点实际上是补充问题,它们不属于答案。似乎您已经与您的助手进行了评论对话,并提出了一个新问题-这是正确的做法。