У меня есть этот небольшой php-скрипт и пара строк в htaccess для перенаправления URL-адресов с строками запросов от верхнего регистра к нижнему регистру.
Тем не менее, он перенаправляет символы верхнего регистра в строке запроса на нижние регистры только в том случае, если в файле url или в каталожной части URL-адреса имеется символ верхнего регистра.
Пример с файлом верхнего регистра:
domain.com/JOBS/?position=Java+Developer
будет перенаправлен на
domain.com/jobs/?position=java+developer
Пример без прописных букв в каталоге или имени файла, но только в строке запроса:
domain.com/jobs/?position=Java+Developer
будет перенаправлен на
domain.com/jobs/?position=Java+Developer
Первый пример успешно перенаправляет каталог и строку запроса на все строчные буквы.
Второй пример не перенаправляет строку запроса на нижний регистр, он остается тем же.
Я не могу понять, что нужно изменить в коде, чтобы строка запроса перенаправлялась на нижний регистр независимо от того, является ли каталог или имя файла заглавными или нет.
Вот код:
Htaccess
RewriteEngine On RewriteBase / # force url to lowercase if upper case is found RewriteCond %{REQUEST_URI} [AZ] RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]
PHP-скрипт
<?php if(isset($_GET['rewrite-strtolower-url'])) { $url = $_GET['rewrite-strtolower-url']; unset($_GET['rewrite-strtolower-url']); $params = http_build_query($_GET); if(strlen($params)) { $params = '?' . strtolower($params); } header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301); exit; } header("HTTP/1.0 404 Not Found"); die('Unable to convert the URL to lowercase. You must supply a URL to work upon.'); ?>
с<?php if(isset($_GET['rewrite-strtolower-url'])) { $url = $_GET['rewrite-strtolower-url']; unset($_GET['rewrite-strtolower-url']); $params = http_build_query($_GET); if(strlen($params)) { $params = '?' . strtolower($params); } header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301); exit; } header("HTTP/1.0 404 Not Found"); die('Unable to convert the URL to lowercase. You must supply a URL to work upon.'); ?>
Вместо:
$params = http_build_query($_GET);
используйте его вот так:
$params = strtolower ( http_build_query($_GET) );
И ваш .htaccess должен быть:
RewriteEngine On RewriteBase / # force url to lowercase if upper case is found RewriteCond %{REQUEST_URI} [AZ] [OR] RewriteCond %{QUERY_STRING} [AZ] RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L,NE]
Поскольку вы должны называть ваш обработчик PHP для обоих случаев.