Чувствительные к регистру 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]