我正在与 mod_rewrite 和 .htaccess 作斗争...我需要做的就是使我的 URL 不区分大小写。在经历了 500 个内部服务器错误和大量谷歌搜索后,大量堆栈溢出,我只是在寻找一种可行的解决方案。
RewriteMap tolower int:tolower
RewriteRule ^([^/]+)/?$ somedir/${tolower:$1}
CheckSpelling on
我需要的只是简单的不区分大小写的 URL :)
以下应该有效:
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/(.*)$ /${lowercase:$1} [R=301,L]
</IfModule>
如果没有,您能否描述一下所提出的解决方案中哪些地方不起作用?
上面的方法不起作用,但下面的方法可以。 请访问 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 时遇到了一些问题,可能是缓存问题,但现在似乎工作正常。
来自 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,因为最初建议的版本引发了错误。
将其放入您的 .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 错误页面。
然后,此脚本应递归搜索文件系统中具有相同名称但大小写不同的页面,并在找到任何页面时重定向用户。
(由 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
使用“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]