0

如何使用 modrewrite 将大写 URL/链接重定向到小写文件,同时保留我网站上的友好 URL(隐藏 .html 和 .htm)?

目前使用以下重写规则来隐藏我网站上的 .htm 和 .html 文件:

RewriteCond %{REQUEST_FILENAME}.htm -f
RewriteRule !.*\.htm$ %{REQUEST_FILENAME}.htm [L]

目标是保留上面的友好 url 规则功能,但同时将我网站中在 url 的文件名部分具有大写字符的所有 url 重定向到始终为小写字母的实际文件名。例如,包括文件名在内的几个带有大写字母的链接看起来像这样: http://sub.domain.com/dir1/100007ABCD 但希望最终 url 为这样的搜索引擎解析:http://sub.domain.com/dir1/100007abcd

我当前的静态文件名包括.htm扩展名,如下所示:http://sub.domain.com/dir1/100007abcd.htm

另外:新规则还需要将所有 .html 文件重写为网站上的友好文件,因为我同时拥有 .htm 和 .html 文件(currentl 规则现在都可以处理),但 .html 文件不需要重定向到小写网址

4

1 回答 1

0

您需要使用Apache 的内部tolower函数定义重写映射。这只能在 vhost 或服务器配置中完成,如果您尝试将这些指令放在 htaccess 文件中,则会导致错误:

RewriteEngine On
RewriteMap lowercase int:tolower

然后,在您的 htaccess 文件中,您可以在已有的任何重写规则之上使用类似的内容。重定向规则必须在您用于友好 url 内容的任何规则之前应用:

# check that the lower case version of the URI is different than the unchanged URI
RewriteCond %{REQUEST_URI} /([^/]+)$
RewriteCond ${lowercase:%1}::%1 !^(.*)::\1$
RewriteRule ^(?:(.+/)|)(.*)$ /$1${lowercase:$2} [L,R=301]

这将重定向任何请求的 URI,其最后一个路径节点(路径的最后一部分/A/B/C,例如C)具有大写字母。我将解释这些规则的作用:

  • RewriteCond %{REQUEST_URI} /([^/]+)$:这个条件只是将最后一个路径节点提取到一个反向引用中,以供稍后使用%1
  • RewriteCond ${lowercase:%1}::%1 !^(.*)::\1$:此条件采用先前提取的路径节点,创建一个字符串,该字符串是全小写::的路径节点、a 和路径节点。正则表达式假定小写版本与未修改版本不同。这意味着最后一个路径节点中有一个大写字母。
  • RewriteRule ^(?:(.+/)|)(.*)$ /$1${lowercase:$2} [L,R=301]:仅当满足前两个条件时才应用此规则。它提取最后一个路径节点(由$2反向引用表示)和它之前的所有内容(如果有)(由$1反向引用表示)。然后它在最后一个路径节点上调用“小写”函数,并 301 重定向浏览器。
于 2013-05-12T22:10:02.487 回答