重定向到默认语言(/ amp / URL除外)

时间:2018-10-19 13:07:22

标签: regex .htaccess url-rewriting

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

在site.com/help/之前,我更改了网站的URL强制使用默认语言,而现在是site.com/en/help/。感谢Stack Overflow的帮助,我进行了重定向,但是后来我遇到了AMP页面的新问题:site.com/amp/help/现在重定向到site.com/en/amp/help/,而原本应该是site.com/amp/en/help/。 / p>

同样,多亏了此站点上的帮助,我将URL的结构更改为site.com/en/help/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]

2 个答案:

答案 0 :(得分:2)

具有这种方式:

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=<fr|en>查询参数传递。 lang参数之后的部分,例如/cart没有斜杠,如果它是真实目录,那么/cart?lang=fr将被Apache的/cart/?lang=fr模块重定向到mod_dir,并且内部URL将在浏览器。

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

答案 1 :(得分:0)

@anubhava的解决方案除一种小情况外均能很好地工作:git checkout重定向到/fr/amp/page.php,我不得不对代码进行一些更改并设法使其正常工作。以下是我进行的一些小的更改的更新代码:

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

2-删除了此规则/fr/page.php/amp

3-要解决.php问题,我将RewriteCond %{REQUEST_URI} !/amp/$ [NC]替换为RewriteRule ^(.+)\.php$ /$1/ [R=301,NC,NE,L]

RewriteRule ^(.+)\.php(.*)$ /$1$2 [R=301,NC,NE,L]