【问题标题】:Apache mod_speling falsely "correcting" URLs?Apache mod_speling 错误地“纠正”了 URL?
【发布时间】:2012-10-13 10:49:34
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

  • 你的配置中有CheckSpelling Off吗?

标签: apache mod-speling


【解决方案1】:

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

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

在您的 shell 中尝试以下操作:

$ 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 实际查看您的网络服务器发送的响应标头。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-30
    • 1970-01-01
    • 2011-07-15
    • 2020-08-09
    • 1970-01-01
    • 2013-08-19
    • 2016-08-20
    • 1970-01-01
    相关资源
    最近更新 更多