Конечный пробел% 20 в URL-адресах, вызывающий 404 ошибки в Codeigniter - PullRequest
2 голосов
/ 21 февраля 2020

Наши URL с закодированным пробелом (%20) в коде URL выдают ошибку 404. Приложение запускается на Codeigniter на Apache.

  • /directory/page%20 вернет ошибку 404

  • /directory/page вернет 200 OK

Как мне перенаправить все URL с конечным %20 на нужный URL?

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Проблема в том, что некоторые сторонние веб-сайты ссылаются на нас с помощью пробела в HREF

В этом случае вы можете добавить что-то вроде следующего в верхней части вашего .htaccess файл перенаправить (канонизировать) такие запросы на удаление завершающего пробела.

Например, перед фронт-контроллером Codeigniter:

RewriteCond %{REQUEST_URI} \s$
RewriteRule (.*) /$1 [R=302,L]

«Обработанный» URL-путь, соответствующий шаблону RewriteRule , уже удалил конечный sla sh, а серверная переменная REQUEST_URI - нет. Таким образом, мы можем проверить конечный пробел в REQUEST_URI и просто перенаправить на «тот же» (обработанный) URL-путь, который захватывается шаблоном RewriteRule .

Серверная переменная REQUEST_URI уже закодирована в%. Класс сокращенных символов \s соответствует любому пробелу, а завершающий $ привязывает его к концу URL-пути.

Сначала выполните тестирование с 302 (временным) перенаправлением, чтобы убедиться, что он работает ОК, прежде чем перейти к 301 (постоянному) перенаправлению.

0 голосов
/ 21 февраля 2020

@ Хуан Каллен, это распространенная проблема, когда у вас есть пробел перед завершающим слэ sh. Например, скажем: "http://example.com/directory/page /". Вы можете заметить пробел перед трейлером sh.

Чтобы решить эту проблему для всех URL, имеющих такое поведение, вы можете использовать функцию PHP rtrim ().

Проверьте код ниже

<?php

function fix_url($url) {
    $trailing_slash = ' /'; //notice a space before the slash
    return $url = rtrim($url, $trailing_slash);
}

Сейчас Вы можете назвать это так:

$error_url = "http://example.com/directory/page /";

$correct_url = fix_url($error_url);

Поскольку вы используете Codeigniter, вы можете поместить эту функцию в вспомогательный файл и обращаться к нему где угодно.

Это идея, попробуйте и дайте мне знать, если она работает.

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