Цикл перенаправления из-за того, что «Заголовок не может содержать более одного заголовка, обнаружена новая строка»

0

Я пытаюсь перенаправить URL-адрес и, как он может быть предоставлен пользователем, может быть несколько недействительным, создавая предупреждающее сообщение

Header may not contain more than a single header, new line detected in

и, как ни странно, PHP генерирует перенаправление на одну и ту же страницу, создавая таким образом цикл переадресации. Как я могу правильно проверить строку, чтобы убедиться, что в URL-адресе нет недопустимых символов? Я пытался

if (false === filter_var($url, FILTER_VALIDATE_URL)) die('Sorry, but no');

но он также не удался по действительным URL-адресам, в которых в них закодированы неанглийские символы. Я также пробовал strpos($url, "\n") и аналогичный "\r" но, вероятно, некоторые "новые строки" различны и не были обнаружены.

В дополнение к моему вопросу об обнаружении, не создает ли цикл перенаправления ошибочное поведение PHP, о котором следует сообщать в этом случае?

  • 0
    Вы можете использовать эту функцию: urlencode()
  • 0
    @Collector будет полезен дополнительный код. Может быть, код всего перенаправления. Также вы можете рассмотреть возможность использования .htaccess
Показать ещё 7 комментариев
Теги:
url-redirection

2 ответа

1
Лучший ответ

Вот что я нашел в комментариях php.net и сделал из него функцию:

function isValidURI($uri) {
    $res = filter_var ($uri, FILTER_VALIDATE_URL);
    if ($res) return $res;
    // Check if it has unicode chars.
    $l = mb_strlen ($uri);
    if ($l !== strlen ($uri)) {
        // Replace wide chars by "X".
        $s = str_repeat (' ', $l);
        for ($i = 0; $i < $l; ++$i) {
            $ch = mb_substr ($uri, $i, 1);
            $s [$i] = strlen ($ch) > 1 ? 'X' : $ch;
        }
        // Re-check now.
        $res = filter_var ($s, FILTER_VALIDATE_URL);
        if ($res) {    $uri = $res; return 1;    }
    }
}

FILTER_VALIDATE_URL не поддерживает интернационализированное доменное имя (IDN). Действительно или нет, ни одно доменное имя с символами Unicode на нем не пройдет проверку.

Логика проста. Символ non-ascii имеет длину более одного байта. Мы заменяем каждый из этих символов символом "X" и снова проверяем.

Источник: http://php.net/manual/en/function.filter-var.php#104160

Надеюсь, это будет полезно и для кого-то другого.

  • 0
    Благодарю. Эта функция работает очень хорошо для URL, которые я тестировал.
0

Вы можете использовать функцию PHP http://php.net/manual/en/function.parse-url.php. "По серьезным искаженным URL-адресам parse_url() может возвращать FALSE".

  • 0
    Это не работает для этого действительного примера URL colnect.com/tool/redirs/…

Ещё вопросы

Сообщество Overcoder
Наверх
Меню