Я пытаюсь удалить знак процента из 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 & изображений.
Когда я добавлю
%
в конце 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 (постоянный), только когда вы уверены, что он работает нормально.
Других решений пока нет …