案例不敏感的URL,隐藏友好的URL扩展名。 .htm和.html

时间:2013-05-12 21:37:52

标签: apache .htaccess mod-rewrite

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

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

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

目标是保留上面的友好网址规则功能,但同时将我网站中url文件名部分中包含大写字符的所有网址重定向到实际文件名,该文件名始终为小写字母。例如,包含文件名的大写字母的几个链接如下所示: http://sub.domain.com/dir1/100007ABCD但想要为此类搜索引擎解析最终网址:http://sub.domain.com/dir1/100007abcd

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

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

1 个答案:

答案 0 :(得分:0)

您需要使用Apache's internal tolower function定义重写地图。这只能在vhost或服务器配置中完成,如果您尝试将这些指令放在htaccess文件中,将导致错误:

RewriteEngine On
RewriteMap lowercase int:tolower

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

# 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$:此条件采用先前提取的路径节点,创建一个全小写路径节点的字符串,::和路径节点。正则表达式假定较低版本的版本与未修改版本不同。这意味着最后一个路径节点中有一个大写字母。
  • RewriteRule ^(?:(.+/)|)(.*)$ /$1${lowercase:$2} [L,R=301]:此规则仅在满足前两个条件时应用。它提取最后一个路径节点(由$2反向引用表示)以及它之前的所有内容(如果有)(由$1反向引用表示)。然后它在最后一个路径节点上调用“小写”函数,301重定向浏览器。