我正在努力解决重定向问题,但没有成功。
在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]
答案 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]