Чувствительные к регистру URL-адреса - как сделать их нечувствительными?
Я борюсь с mod_rewrite и .htaccess... Все, что мне нужно сделать, это сделать мой URL случайным в. После нескольких 500 внутренних ошибок сервера и большого количества ошибок в переполнении стека я просто ищу одно рабочее решение.
НЕ: Преобразовать в нижний регистр в правило mod_rewrite
RewriteMap tolower int:tolower
RewriteRule ^([^/]+)/?$ somedir/${tolower:$1}
НЕ: Нечувствительные к регистру URL-адреса с mod_rewrite
CheckSpelling on
Все, что мне нужно, это простые нечувствительные к регистру URL-адреса:)
Ответы
Ответ 1
Следующее должно работать:
<IfModule mod_rewrite.c>
RewriteEngine on
rewritemap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L]
</IfModule>
Если нет, можете ли вы описать, что не работает с предлагаемыми решениями?
Ответ 2
Вышеприведенное не работает, но следующее. Играйте с ней на www.chassis-plans.com/off-the-shelf-industrial-pc.html. Измените любой случай в URL-адресе, и код изменит его на соответствующий случай и отобразит страницу. Если вы разместите URL-адрес, который не существует (www.chassis-plans.com/x), отобразится пользовательская страница 404.
Сначала добавьте следующее в ваш файл .htaccess, где /forwarding -site-nocase.html - это мой собственный URL-адрес страницы 404.
AddType application/x-httpd-php .html .htm
ErrorDocument 404 /forwarding-site-nocase.html
Затем, на самой верхней части вашей пользовательской страницы 404, начиная с строки 1, добавьте следующее. Если у вас есть пустая строка, она терпит неудачу.
<?php
$mydir=getdir("/",$_SERVER['REQUEST_URI']);
if($mydir!=false)
{
$thedomain = 'http://' . $_SERVER['SERVER_NAME'];
header("HTTP/1.1 301 Moved Permanently");
header( 'Location: ' . $thedomain.$mydir );
}
function getdir($loc,$tfile)
{
$startloc=$_SERVER['DOCUMENT_ROOT'];
if (file_exists($startloc.$loc) && $handle = opendir($startloc.$loc))
{
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && strncasecmp($loc.$file,$tfile,strlen($loc.$file))==0)
{
if(strncasecmp($loc.$file,$tfile,strlen($tfile))==0)
{
return $loc.$file;
}
else
{
return getdir($loc.$file."/",$tfile);
}
}
}
closedir($handle);
}
return false;
}
?>
Теперь вы можете следовать этому стандарту HTML для своей страницы 404, например:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Language" content="en" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="Company information page - Page Not Found Error"/>
<meta name="search" content="Company information page - About Us. Manufacturer of rack mount rugged computer systems and rugged LCD displays for the military and industrial markets" />
и т.д. для остальной части страницы.
У меня были некоторые проблемы с IE, возможно, с кешем при разработке и тестировании, но теперь он работает нормально.
Ответ 3
Поместите это в ваш .htaccess файл:
ErrorDocument 404 /notfound.html
AddType application/x-httpd-php .html
Поместите это в notfound.html:
<?php
$tdir=getdir("/",$_SERVER['REQUEST_URI']);
if($tdir!=false)
{
header("HTTP/1.1 301 Moved Permanently");
header( 'Location: http://yourdomain.com'.$tdir );
}
function getdir($loc,$tfile)
{
$startloc="/path/to/root/dir";
if (file_exists($startloc.$loc) && $handle = opendir($startloc.$loc))
{
while (false !== ($file = readdir($handle)))
{
if ($file != "." && $file != ".." && strncasecmp($loc.$file,$tfile,strlen($loc.$file))==0)
{
if(strncasecmp($loc.$file,$tfile,strlen($tfile))==0)
{
return $loc.$file;
}
else
{
return getdir($loc.$file."/",$tfile);
}
}
}
closedir($handle);
}
return false;
}
?>
404 Error, Page Not Found
Замените yourdomain.com на URL вашего сайта. Замените /path/to/root/dir с абсолютным путем в корневой каталог, чтобы начать поиск. Замените ошибку 404, страница не найдена с пользовательской страницей ошибок 404.
Этот script должен затем рекурсивно искать вашу файловую систему для страниц с тем же именем, но с различной капитализацией и перенаправлять пользователя, если они есть.
Ответ 4
(Перевод Google)
Какая потребность в рекурсивном?
Если вы знаете путь к файлу:
dirname ($ _SERVER ['REQUEST_URI'])
Осталось только определить правильное имя файла.
Моей упрощенной версией script будет:
.htaccess(в корневой папке)
ErrorDocument 404 /notfound.php
notfound.php(в корневой папке)
<?php
$tdir=getdir($_SERVER['REQUEST_URI']);
if($tdir != false) {
header("HTTP/1.1 301 Moved Permanently");
header( 'Location: http://www.YOURDOMAIN.COM'.$tdir );
} else {
die('YOUR PERSONAL MESSAGE FOR 404');
}
function getdir($tfile) {
$startloc="/HOME/YOUR/PATH/TO/WWW".dirname($tfile);
if (file_exists($startloc) && $handle = opendir($startloc)) {
while (false !== ($file = readdir($handle))) {
if ($file != "." && $file != ".." && strcasecmp($file,basename($tfile))==0) {
return dirname($tfile).DIRECTORY_SEPARATOR.$file;
}
}
closedir($handle);
}
return false;
}
?>
Не забудьте изменить:
1. YOURDOMAIN.COM
2. ВАШЕ ЛИЧНОЕ СООБЩЕНИЕ ДЛЯ 404
3./HOME/YOUR/PATH/TO/WWW
Ответ 5
используя папку "vhosts.conf". URL-адрес можно сделать чувствительным. местоположение:/var/www/vhosts/domain.com/conf/vhosts.conf
RewriteEngine on
rewritemap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L]