如何使用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文件不需要重定向到小写网址
答案 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重定向浏览器。