Перенаправление на язык по умолчанию, за исключением / amp / URL - PullRequest
0 голосов
/ 19 октября 2018

Я изо всех сил пытаюсь решить проблему перенаправления, но безуспешно.

Я изменил URL своего сайта, применяя язык по умолчанию, прежде чем это было site.com/help/, а теперь это site.com/en/help/.Благодаря помощи Stack Overflow я сделал перенаправление, но потом столкнулся с новой проблемой со страницами 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]

Ответы [ 2 ]

0 голосов
/ 24 октября 2018
Решение

@ 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]
0 голосов
/ 22 октября 2018

Сделайте так:

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.

В более позднем правиле мы удаляем компонент lang из URL и передаем его как lang=<fr|en> параметр запроса.Часть после параметра lang, например, /cart не имеет завершающей косой черты, и если это реальный каталог, то /cart?lang=fr будет перенаправлен на /cart/?lang=fr модулем mod_dir Apache, и ваш внутренний URL будет отображаться в браузере..

Таким образом, в этом текущем правиле мы собираем деталь после компонента lang и проверяем, нет ли у нас завершающего слеша и является ли он каталогом, тогда это правило внутренне переписывается в /fr/cart/ с завершающим слешем.Позже правило переписывает его на /cart/?lang=fr и mod_dir больше не перенаправляет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...