Я пытаюсь перенаправить 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, о котором следует сообщать в этом случае?
Вот что я нашел в комментариях 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
Надеюсь, это будет полезно и для кого-то другого.
Вы можете использовать функцию PHP http://php.net/manual/en/function.parse-url.php. "По серьезным искаженным URL-адресам parse_url() может возвращать FALSE".
urlencode()
.htaccess