Переадресация урлов на нижний регистр

Аватар пользователя Boozenok Boozenok 14 августа 2015 в 13:27

Ребята, у кого будут какие мысли?

Бьюсь над переадресацией урлов с верхнего регистра в нижний.

Перепробовала массу вариантов, из всех сработали два:

1. с github

2. И вариант такой

RewriteCond %{REQUEST_URI} [A-Z] [OR]
RewriteCond %{QUERY_STRING} [A-Z]
RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L,NE]

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} [A-Z] [OR]
RewriteCond %{QUERY_STRING} [A-Z]
RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L,NE]
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

Собственно, сам rewrite-strtolower.php:

<?php
if(isset($_GET['rewrite-strtolower-url'])) {

    $url = $_GET['rewrite-strtolower-url'];
    unset($_GET['rewrite-strtolower-url']);
    $params = strtolower ( http_build_query($_GET));

    if(strlen($params)) {
        $params = '?' . $params;
    }

    header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301);
    exit;
}
header("HTTP/1.0 404 Not Found");
die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');

Редирект срабатывает в обоих правилах, но слетает очистка кеша через админ-панель, редиректит на страницу вида -
/admin_menu/flush-cache?token=pimli22ju1spzp4uvej5miha1d2cu-3vbojkz3-hxwq&destination=node%2f1528

и также перестают грузиться или удаляться изображения в админке, выдает - Неустранимые ошибки. Размер загружаемого файла вероятно, превысила максимально допустимый размер файла (50 МБ), который поддерживает данный сервер

Видать где-то происходит не корректный редирект.
У кого есть идеи почему так может происходить?

Комментарии

Аватар пользователя t1mm1 t1mm1 14 августа 2015 в 18:30

а почему вы не попробуете сгенерировать новые урлы, сохранив старые, и делать переадресацию со старых на новые по 301?

1. то есть по факту - вам нужен обработчик, который бы при сохранении делал урлу в нижнем регистре.
2. делал бы переадресацию со старых урлов на новые. это кстати есть в коробке от pathauto. Как и механизм обновления урлов, и построения самих урлов.

Аватар пользователя Boozenok Boozenok 16 августа 2015 в 22:41

t1mm1 wrote:
а почему вы не попробуете сгенерировать новые урлы, сохранив старые, и делать переадресацию со старых на новые по 301?

1. то есть по факту - вам нужен обработчик, который бы при сохранении делал урлу в нижнем регистре.
2. делал бы переадресацию со старых урлов на новые. это кстати есть в коробке от pathauto. Как и механизм обновления урлов, и построения самих урлов.

так все урлы идут в нижнем регистре в принципе. В верхнем регистре их нет вообще, но если вбить в адрессной строке site.ru/catalog/meBEL страничка будет доступна и гугл тоже ее видит, а по идее должна срабатывать переадресация на site.ru/catalog/mebel

Аватар пользователя t1mm1 t1mm1 17 августа 2015 в 1:22

и?
Вас беспокоит то, что гугл "увидит" эти ссылки и будут дубли?
Ну так не давайте гуглу эти ссылки.

Аватар пользователя dropout dropout 17 августа 2015 в 9:22

а разве puthauto это не умеет? У него же в настройках есть удаление всех синонимов и генерация новых, так же есть настройка переводить все в нижний регистр.

Аватар пользователя Boozenok Boozenok 17 августа 2015 в 13:08

t1mm1 wrote:
и?
Вас беспокоит то, что гугл "увидит" эти ссылки и будут дубли?
Ну так не давайте гуглу эти ссылки.

Да, это же дублирование страницы. Как не давать их гуглу? я же не могу запретить ему не видеть заглавные буквы. А их можно ввести в любом урле на сайте и адрес будет доступен, вот и логично сделать 301.

Graytone wrote:
а разве puthauto это не умеет? У него же в настройках есть удаление всех синонимов и генерация новых, так же есть настройка переводить все в нижний регистр.

Мне не нужно удалять. нет на сайте урлов с заглавными буквами (все прописывается маленькими), в том то и дело, о они все-равно доступны в адресной строке.
Переводить в нижний регистр - это Global Redirect, но урлы все-равно доступны.

Аватар пользователя t1mm1 t1mm1 18 августа 2015 в 15:24

У pathauto есть отличная документация, где подобные настройки добавляются в 10-15 строчек кода.
+ опять же, hook_preprocess - и можно обработать при определенных условиях тот же редирект.

Как я понимаю, у автора проблема в том, что url формирует алиас с верхнем регистре.
Но решать этот вопрос с помощью .htaccess не стоит. Но если автор настаивает, то решение тут
http://www.askapache.com/htaccess/rewrite-uppercase-lowercase.html

Опять же. Это не решит изначальную проблему - создание самих ссылок.

Что бы не писать переадресации, рекоммендую написать свой токен для формирования ссылок, как пример - https://www.drupal.org/node/1308488

Там ничего сложного. Но еще лучше - это написать обработчик для pathauto.

-------update.
И все есть еще решение.
Вы можете для full mode просмотра, например, отлавливать ссылку и делать проверку, есть ли в ней сивмолы верхнего регистра, и если да - переводить все в нижний и отправлять через drupal_goto($url, 301) пользовтеля. Но не используйте header для этого, от него потом одни проблемы..

Аватар пользователя Boozenok Boozenok 17 августа 2015 в 13:09

даже когда делаю грубо:

  if($_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI'])){
header('Location: http://'.$_SERVER['HTTP_HOST'].strtolower($_SERVER['REQUEST_URI']), true, 301);
exit();
}

Происходят теже ошибки. Видимо сам Drupal не воспринимает strtolower или может быть дело в хостинге? такое возможно?

Аватар пользователя t1mm1 t1mm1 18 августа 2015 в 15:32

Еще вариант по переадресации.

Создайте модуль redirectto
В redirectto.module пропишите вот это

function redirectto_preprocess_page(&$cars) {
  $uri = request_uri();
  if ($uri != strtolower($uri)) {
    $n_uri = strtolower($uri);
    drupal_goto($n_uri, array(), 301);
  }
}

включите модуль, обновите кеш и должно переносить.
Это если на пхп.

Аватар пользователя Boozenok Boozenok 18 августа 2015 в 18:45

"t1mm1" wrote:
Опять же. Это не решит изначальную проблему - создание самих ссылок.

Что бы не писать переадресации, рекоммендую написать свой токен для формирования ссылок

Идея хорошая, попробую попробовать еще так

Аватар пользователя Coolbits Coolbits 30 декабря 2015 в 0:21

Я нашел решение!
В index.php в корневой папке вставь код:

<?phpif($_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI'])){
header('Location: http://'.$_SERVER['HTTP_HOST'].strtolower($_SERVER['REQUEST_URI']), true, 301);
exit();
}?>

У меня сработало отлично! Именно в index.php, если вставить в template - кэширование все портит.

Аватар пользователя Grenuy Grenuy 4 июня в 12:49

Модуль создаем, и что бы с кэшем проблем не было то хук другой юзать нужно,

<?php
function redirectto_boot() {
    if(
$_SERVER['REQUEST_URI'] != strtolower($_SERVER['REQUEST_URI'])){
        
header('Location: https://'.$_SERVER['HTTP_HOST'].strtolower($_SERVER['REQUEST_URI']), true301);
        exit();
    }    
}
?>