我正在将所有数据从旧的 Windows FTP 服务器迁移到 Linux 环境,但遇到了一些问题。
以前上传文件(通常是简单的 html 文件和图像)的人遵循了非常糟糕的做法,将文件夹和文件名中的某些字符大写,然后在 html 代码中输入大小写错误的文件名。他们还一直以小写形式发送指向这些文件的超链接。由于服务器是 Windows,不区分大小写,因此它只是原谅了这一点,无论如何一切都会正常运行。
现在文件已经迁移到区分大小写的文件系统。这些超链接已损坏,并且编码不正确的 HTML 文件将无法工作。
我一直在考虑几种解决方案。目前我的计划是使用 .htaccess 使所有请求不区分大小写,但我想确保我考虑到了这可能产生的任何不利影响。我知道这可能会对动态生成的页面或链接产生严重影响,但由于这只是一个简单的暂存服务器,我们只用它来显示示例文件,所以我们无论如何都不会做任何这些事情。
这是否也会影响 html 代码中的 href 标签?是否还有其他我可能没有想到的严重后果?
我只是想收集一些其他的意见和选择。有没有更好的方法来解决这个问题?
多谢你们!
答案1
我对 Apache 提供的拼写纠正功能非常满意mod_speling这样做的好处是您不必修改现有的文件/目录名称,也不必修改现有的 HTML 代码,但您的里程可能会有所不同:
它通过将请求目录中的每个文档名称与请求的文档名称进行比较(不考虑大小写)来完成其工作,并且(可选)允许最多一个拼写错误(字符插入/遗漏/调换或错误字符)。使用此策略匹配的所有文档名称都会建立一个列表。
如果在扫描目录之后,
- 没有找到匹配的文档,Apache 将照常进行并返回“未找到文档”错误。
- 只找到一个“几乎”匹配请求的文档,则以重定向响应的形式返回。
- 如果找到多个具有密切匹配的文档,则将匹配的列表返回给客户端,然后客户端可以选择正确的候选。
通过设置启用:
CheckSpelling On
在您的 httpd.conf 中的 VirtualHost 和/或 Directory 块(甚至是 .htaccess 文件)中。
您可以使用以下方式将拼写更正限制为仅更改小写/大写:
CheckCaseOnly On
答案2
我不会使用 .htaccess 规则。如果有很多文件/文件夹等,最终可能会变得复杂。
我会做什么:编写一个 bash 脚本,将所有文件和文件夹转换为小写。确保所有内容都是小写,没有大写。
不确定我是否理解正确,但您说的是超链接都是小写的。如果是这样,将所有文件名都转换为小写应该可以解决您的问题。
您可以使用像这样的简单 bash 脚本(我们称之为重命名:
#!/bin/bash
echo -n "Enter full path: "
read FULLPATH
for item in `find $FULLPATH -depth`
do
DST=`dirname "${item}"`/`basename "${item}" | tr '[A-Z]' '[a-z]'`
if [ "${item}" != "${DST}" ]
then
[ ! -e "${DST}" ] && mv -T "${item}" "${DST}" || echo "${item} was not renamed"
fi
done
我会创建一个首先备份(所有文件和文件夹,以防万一)。
只需保存脚本,使其可执行(chmod +x 重命名.sh) 然后运行它。它会要求输入完整路径(文件/文件夹所在的位置)。然后它会递归搜索所有文件和文件夹,并将包含大写字母的文件和文件夹转换为小写字母。
更新:
如果您不想修改 html 文件中的链接和引用(带有大写的),您可以采用这种方法:
RewriteEngine on
RewriteBase /
RewriteMap lowercase int:tolower
RewriteCond $1 [A-Z]
RewriteRule ^/?(.*)$ /${lowercase:$1} [R=301,L]
请记住,上述重写规则应在 apache 配置文件(vhost 配置)中使用,而不是在 .htaccess 文件中使用
对于其他选项,您也可以查看此链接: https://www.askapache.com/htaccess/rewrite-uppercase-lowercase/
答案3
在添加 htaccess 规则以将所有请求重写为 toLower 后,您应该编写一个测试脚本来检查所有 HREF(和导航链接)。这足以检查此提议的更改如何影响您网站的其他区域。如果您重写所有请求,我唯一能想到的是,如果您的网站的任何区域处于基本身份验证前提下,此类请求的 URL 会发生什么。protocol://username:[email protected]/login