Редирект URL со слэшем в конце на без слэша

Это не вопрос, а решение.
Ниже код плагина, который решает задачу: редирект URL со слэшем в конце на URL без слэша в конце.
Гугл/яндекс в течение часа дал ответ на обратную задачу (редирект без слэша в конце на со слэшем).
Делюсь доработкой с надеждой, что это вылезет в топ и поможет сохранить время следуюшим поколениям :)
Также сделаны настройки по пунктам 1-6 отсюда.

Плагин настраивается на событие OnLoadWebDocument:

<?php
if ($modx->event->name == 'OnLoadWebDocument') {
  $request = $_SERVER['REQUEST_URI'];
  $params = '';
  if (strpos($request, '?') !== false) {
  	list($request, $params) = explode('?', $request);
  }
  $uri = $request;
  if(!empty($uri) && strpos($uri, '.') === false && substr($uri, -1, 1) == '/') {
    $uri = substr($uri, 0, -1);
    if (!empty($params)) {
      $uri .= '?' . $params;
    }
    $modx->sendRedirect($uri, array('responseCode' => 'HTTP/1.1 301 Moved Permanently'));
  }
}
Мартин Очоа
18 июля 2017, 21:19
modx.pro
5
5 690
+1

Комментарии: 7

Олег
19 июля 2017, 10:35
0
А чего не через .htaccess или nginx?
    UDAV
    20 июля 2017, 23:07
    0
    Это встроено в modx уже. Дружественные урлы и параметр container_suffix… просто оставьте его пустым и слешей не будет.
      Сергей
      29 октября 2018, 22:53
      0
      С этим решение перестали работать ссылки вида www.domen.ru/?utm
      Возможно только у меня.
        Сергей
        29 октября 2018, 23:12
        1
        0
        Через .htaccess заработало это:
        RewriteEngine On
        RewriteRule ^(.*)\/$ $1 [R=301,L]
          Дмитрий
          08 ноября 2019, 09:43
          0
          А вход в админку работает? У меня без / на конце в админку не входит «Страница недоступна».
            Сергей
            13 ноября 2019, 10:24
            0
            Работает.
            Полностью файл .htaccess выглядит так:
            RewriteEngine On
            RewriteRule ^(.*)\/$ $1 [R=301,L]
            RewriteBase /
            
            RewriteRule "/\.|^\.(?!well-known/)" - [F]
            
            RewriteCond %{HTTP_HOST} !^$
            RewriteCond %{HTTP_HOST} !^www\. [NC]
            RewriteCond %{HTTP_HOST} (.+)$
            RewriteRule ^(.*)$ https://www.%1/$1 [R=301,L] .
            
            RewriteCond %{SERVER_PORT} !^443
            RewriteRule (.*) https://www.domen.ru/$1 [R=301,L]
            
            RewriteCond %{REQUEST_FILENAME} !-f
            RewriteCond %{REQUEST_FILENAME} !-d
            RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
            Сделаны пункты с 1 по 6.
            Добавлен [[Canonical]]
            Тег base не удалял.
            Плагин автора поста не использовал.
            Все работает корректно (хостинг виртуальный, reg. ru)
              Владислав
              19 февраля 2020, 11:18
              0
              Каждой папки можно указывать свой .htaccess и свои правила редиректа. Для того, что бы работала админка достаточно в папку /manager добавить свой .htaccess с директивой RewriteEngine Off и на админку не будет действовать правила корневого .htaccess
            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
            7