htaccess удалить процент из строки URL

Я пытаюсь удалить знак процента из URL с помощью .htaccess, Когда я добавлю % в конце URL я получаю код запроса 400.

Вот мой .htaccess код:

# NON-WWW HTTPS
RewriteEngine On
RewriteBase /
RewriteCond %{HTTPS} !=on
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

### NO SLASH ON URL END
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

### FORCE TO LOAD EXISTING FILES
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f

### URL AS MAIN STRING
RewriteRule ^(.+)$ index.php?url=$1 [QSA,L]

Я нашел какое-то похожее решение здесь htaccess для экранирования процентов (%) от URL но это не работа в моем случае.

Когда я добавляю строку в конце:

RewriteRule .* index.php?url=$1 [PT,B]

.htaccess не загружал внешние файлы, такие как CSS & изображений.

1

Решение

Когда я добавлю % в конце URL я получаю код запроса 400.

400 «Bad Request» запускается Apache до .htaccess/ mod_rewrite может обрабатывать URL. С произвольной % в URL-адресе полностью недопустимый URL-адрес (сам по себе он должен быть закодирован как% %25).

Если вам нужно исправить эти URL, то вы можете создать пользовательский 400 ErrorDocument и в этом документе об ошибке (в PHP) проверьте запрошенный URL для %, удали их и перенаправь.

Например, в верхней части вашего .htaccess файл:

ErrorDocument 400 /errdocs/e404.php

Затем в /errdocs/e404.php Вы можете проверить $_SERVER['REDIRECT_URL'] переменная (и необязательно $_SERVER['REDIRECT_QUERY_STRING'] — в зависимости от того, где в URL вы проверяете %) для произвольной % и 301 перенаправление (переопределение статуса 400).

Например, в вашем e404.php документ об ошибке:

// Since the REDIRECT_URL value is already %-decoded we can simply remove
// any remaining "%" if none are meant to be in the URL (even if correctly encoded as %25)
if (strstr($_SERVER['REDIRECT_URL'], '%')) {
$cleanUrl = str_replace('%', '', $_SERVER['REDIRECT_URL']);
// Append back the query string (if any)
if (isset($_SERVER['REDIRECT_QUERY_STRING'])) {
$cleanUrl .= '?'.$_SERVER['REDIRECT_QUERY_STRING'];
}

// Redirect to clean URL
header('Location: http://'.$_SERVER['HTTP_HOST'].$cleanUrl,true,302);
exit;
}

Как отмечено в комментарии к коду выше, это удаляет любой % которые остаются в URL-пути, даже если они правильно закодированы. В настоящее время это не проверяет строку запроса, но вы можете применить тот же процесс к REDIRECT_QUERY_STRING если хочешь.

Протестируйте с 302 (временным) перенаправлением и измените его на 301 (постоянный), только когда вы уверены, что он работает нормально.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector