перенаправление удаления косой черты не работает в .htaccess apache - PullRequest
0 голосов
/ 16 мая 2019

Я работаю над проектом, в котором я перенес старый на новый сайт. SEO все еще работает для старого сайта, поэтому я написал правила в своем приложении yii2 как

'rules' => [
                "<year:\d{4}>/<number1:\d{2}>/<number2:\d{2}>/<slug>"=>'video/parse',

Это перенаправление yii2 работает нормально для URL, не заканчивающихся косой чертой. Но это правило не работает для конечных URL-адресов. Чтобы справиться с этой проблемой, я попытался перенаправить через apache. Для этого я пишу этот код

<VirtualHost *:80>
RewriteEngine on

RewriteCond %{SERVER_NAME} =mydomain.org
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [R=301,L]

задачи1:
Когда я нажимаю http://example.org/2017/09/10/slug/, он перенаправляется на http://example.org//2017/09/10/slug/, поскольку после имени домена добавляется дополнительный слеш.
задачи2:
Когда я нажимаю https://example.org/2017/09/10/slug/, он все равно не перенаправляется.

Вопросы:
1. Как нам перенаправить на косую черту?
2. Как заставить перенаправление работать на https?

Ответы [ 2 ]

1 голос
/ 16 мая 2019

Возможно, вам следует использовать UrlNormalizer для таких перенаправлений:

'urlManager' => [
    // ...
    'normalizer' => [
        'class' => yii\web\UrlNormalizer::class,
        // you can use temporary redirection instead of permanent for tests
        // 'action' => UrlNormalizer::ACTION_REDIRECT_TEMPORARY,
    ],
],

Подробнее о нормализации URL можно прочитать в этой статье руководства .

0 голосов
/ 16 мая 2019

Проблема, с которой вы сталкиваетесь, заключается в том, что вы на самом деле не используете динамический файл конфигурации (".htaccess"), как вы утверждаете (я предполагаю, что так как директива VirtualHost там недопустима). А поскольку логика RewriteRule работает с абсолютными путями при использовании в файлах конфигурации реального http-сервера, а не с относительными путями при использовании в файлах динамической конфигурации. Это задокументировано довольно заметно, на самом деле. Это различие в логике приводит к тому, что ваш захват (который вы повторно используете со ссылкой $1) содержит действительный начальный слеш.

Так что все, что вам нужно сделать, это изменить свое правило на более надежную версию:

RewriteRule ^/?(.*)/$ /$1 [R=301,L]

Этот ведущий ^/? позволяет использовать неизменное правило аналогичным образом в обеих версиях файлов конфигурации с идентичной логикой. Я полагаю, причина этого должна быть ясна.

Хорошей идеей будет начать с временного перенаправления 302 и изменить его только на постоянное перенаправление 301 позже, если вы уверены, что все настроено правильно. Это предотвращает проблемы с кэшированием при попытке ...

И общее замечание: вам всегда следует размещать такие правила в конфигурации хоста http-серверов, а не использовать файлы динамической конфигурации (".htaccess"). Эти динамические конфигурационные файлы добавляют сложность, часто являются причиной неожиданного поведения, их трудно отладить, и они действительно замедляют работу http-сервера. Они предоставляются только в качестве последнего варианта для ситуаций, когда у вас нет доступа к реальной конфигурации хоста http-серверов (читай: действительно дешевые поставщики услуг) или для приложений, настаивающих на написании своих собственных правил (что является очевидным кошмаром безопасности).

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