区分大小写的 URL - 如何使其不区分大小写?

问题描述 投票:0回答:6

我正在与 mod_rewrite 和 .htaccess 作斗争...我需要做的就是使我的 URL 不区分大小写。在经历了 500 个内部服务器错误和大量谷歌搜索后,大量堆栈溢出,我只是在寻找一种可行的解决方案。

工作:在mod_rewrite规则中转换为小写

RewriteMap tolower int:tolower
RewriteRule  ^([^/]+)/?$  somedir/${tolower:$1}

工作:使用mod_rewrite的不区分大小写的URL

CheckSpelling on

我需要的只是简单的不区分大小写的 URL :)

apache .htaccess mod-rewrite
6个回答
5
投票

以下应该有效:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteMap lowercase int:tolower
    RewriteCond $1 [A-Z]
    RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L] 
</IfModule>

如果没有,您能否描述一下所提出的解决方案中哪些地方不起作用?


1
投票

上面的方法不起作用,但下面的方法可以。 请访问 www.chassis-plans.com/off-the-shelf-industrial-pc.html 进行试用。 更改 URL 中的任何大小写,代码会将其更改为适当的大小写并显示页面。 如果您输入的 URL 不存在 (www.chassis-plans.com/x),则会显示自定义 404 页面。

首先,将以下内容添加到您的 .htaccess 文件中,其中 /forwarding-site-nocase.html 是我的自定义 404 页面 URL。

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;
}
?>

现在您可以按照此操作使用自定义 404 页面的标准 HTML,例如:

<!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 时遇到了一些问题,可能是缓存问题,但现在似乎工作正常。


1
投票

来自 user2305090 的上述其中一项的变体,对我有用:

首先,将以下内容添加到您的 .htaccess 文件中,其中 /forwarding-site-nocase.php 是我的自定义 404 页面 URL。

ErrorDocument 404 /forwarding-site-nocase.php

然后,在自定义 404 页面的最顶部,从第 1 行开始,添加以下内容。如果你先有一个空行,就会失败。

<?php
$mydir=getdir("/",$_SERVER['REQUEST_URI']);
if($mydir!=false)
{
    $thedomain = 'https://' . $_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;
}
?>

现在您可以按照此操作使用自定义 404 页面的标准 HTML,例如:

<!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" />

页面的其余部分依此类推。

注意,我将“http://”更改为“https://”,并将错误文件显式更改为 .php,因为最初建议的版本引发了错误。


0
投票

将其放入您的 .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 错误页面。

然后,此脚本应递归搜索文件系统中具有相同名称但大小写不同的页面,并在找到任何页面时重定向用户。


0
投票

(由 Google 翻译)

什么情况下需要进行递归?
如果您知道文件路径:

dirname ($ _SERVER ['REQUEST_URI'])

只需识别正确的文件名即可。

我的脚本的简化版本是:

.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/您的/路径/TO/WWW


0
投票

使用“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]
© www.soinside.com 2019 - 2024. All rights reserved.