2

我的任务是将旧的动态网站从 Windows 服务器迁移到 Linux。该网站最初是在不考虑字符大小写的情况下编写的。有些文件名都是大写的,有些是小写的,有些是混合的。当然,这在 Windows 中从来都不是问题,但现在我们正在转向区分大小写的文件系统。

带有快速查找/重命名命令(感谢另一个教程)的文件名全部小写。

但是,代码中的许多 URL 引用仍然指向这些大小写混合的文件名,因此我启用了 mod_speling 来克服这个问题。它似乎在大多数情况下都可以正常工作,除了一页:我有一个文件名haematobium.html,每次链接指向 时,它都会像在浏览器中.../haematobium.html一样被重写。.../hæmatobium.html

我不知道这个奇怪的字符最初是如何进入文件名的,但我已将 HTML 文档中的代码更正为现在链接到haematobium.html,然后重命名haematobium.html文件本身以匹配。

.../haematobium.html在 Chrome 中请求时,它会.../hæmatobium.html在地址栏中“更正”为,并显示错误消息“.../hæmatobium.html在此服务器上找不到请求的 URL”。

在 IE9 中,提示我登录(这是一个受 .htaccess 保护的页面),我输入它,然后如果将 URL 转发到.../h%C3%A6matobium.html,它又不会加载。

在我的挫败感中,我什至都复制haematobium.html到了这三个页面hæmatobium.htmlhæmatobium.html但实际上这三个页面都没有加载。

所以我的问题是:我在某处读到 mod_speling 试图“学习”拼写错误的 URL。它是否真的重命名了文件(奇怪的字符可能来自哪里)?它是否保留了所要求的缓存以及转发到的缓存(我可以清除的缓存)?

PS。还有许多对 MySQL 数据库表和字段的混合大小写引用,但这完全是“另一个噩梦”。

4

1 回答 1

1

[还不能评论,所以回答。]

您的问题并未完全清楚 haematobium.html 的两个名称(两个字符 ae [ASCII] 或一个连字字符æ [Unicode])中的哪一个实际上存在于您的 Apache 文件系统中。

在您的外壳中尝试以下操作:

$ echo -n h*matobium.html | hd

输出应该是以下两种选择之一。这是 ASCII,ae分别为 61 和 65:

00000000  68 61 65 6d 61 74 6f 62  69 75 6d 2e 68 74 6d 6c  |haematobium.html|
00000010

这是 Unicode,使用 c3 a6 表示单个字符æ

00000000  68 c3 a6 6d 61 74 6f 62  69 75 6d 2e 68 74 6d 6c  |h..matobium.html|
00000010

我建议使用 ASCII 版本,它使生活变得更加轻松。

现在到你的实际问题。mod_speling既不“学习”,也不重命名或缓存其数据。缓存要么由您的浏览器完成,要么由您的浏览器和服务器之间的代理完成。

实际上,使用wgetcurl等命令行工具测试这些案例是最佳实践,这些工具应该已经可用或可以轻松安装在任何 Linux 上。

使用wget -Scurl -i实际查看您的 Web 服务器发送的响应标头。

于 2012-10-27T22:07:40.743 回答