使用Apache htaccess文件将URL更改为小写

时间:2014-03-05 18:59:03

标签: apache .htaccess

如何修改Apache上的.htaccess文件以执行以下操作:

“如果网址以.aspx结尾,请将整个网址重写为小写。”

背景故事:我最近将一个网站从ASPX托管迁移到Linux / Apache托管。野外有一些旧的URL(营销材料),我需要确保这些URL仍然有用; Windows Web服务器不区分大小写,但Linux Web服务器是。

提前致谢。

3 个答案:

答案 0 :(得分:4)

您需要定义一个rewrite map,它只能在server / vhost配置文件中完成,而不能在htaccess文件中完成。您需要添加以下内容:

RewriteMap lc int:tolower

然后在您的htaccess文件中,您可以创建如下规则:

RewriteCond %{REQUEST_URI} [A-Z]
RewriteRule ^(.*\.aspx)$ ${lc:$1} [L,NC]

这将检查URI中是否有大写字母,然后应用将所有内容转换为小写字母的地图。

答案 1 :(得分:3)

如果您不在共享托管环境中并且乐于直接在Apache配置中输入规则,则可以使用mod_rewrites RewriteMap指令进行小写转换:

RewriteMap lc int:tolower
RewriteRule (.*?[A-Z]+.*) ${lc:$1} [R]

有关详细信息,请参阅Apache手册:Redirect a URI to an all-lowercase version of itself。虽然在那里注意到建议使用mod_speling而不是这个重写规则。

Apache 重写和 PHP Taken from here

的.htaccess

RewriteEngine on
RewriteBase /

# force url to lowercase if upper case is found
RewriteCond %{REQUEST_URI} [A-Z]
# ensure it is not a file on the drive first
RewriteCond %{REQUEST_FILENAME} !-s
RewriteRule (.*) rewrite-strtolower.php?rewrite-strtolower-url=$1 [QSA,L]

重写-strtolower.php

<?php
if(isset($_GET['rewrite-strtolower-url'])) {
    $url = $_GET['rewrite-strtolower-url'];
    unset($_GET['rewrite-strtolower-url']);        
    $params = strtolower(http_build_query($_GET));
    if(strlen($params)) {
        $params = '?' . $params;
    }
    header('Location: http://' . $_SERVER['HTTP_HOST'] . '/' . strtolower($url) . $params, true, 301);
    exit;
}
header("HTTP/1.0 404 Not Found");
die('Unable to convert the URL to lowercase. You must supply a URL to work upon.');

设置重写模块
检查传入的URL是否包含任何大写字母
确保传入的URL不引用磁盘上的文件(您可能希望在其名称中托管一个大写字母的文件 - 例如客户端通过您提供的CMS上传的PDF文件)<登记/> 发送符合上述规则的所有请求然后重写到我们的脚本中,该脚本将实际转换为小写工作 这里唯一要注意的是QSA修饰符,它确保所有GET“变量”都传递到脚本

接下来是完成所有工作的PHP小片段。
这是一个名为rewrite-strtolower.php的文件,与上面提到的.htaccess文件位于同一目录中。

答案 2 :(得分:2)

试试这段代码:

RewriteEngine On
RewriteBase /

# If there are caps, set HASCAPS to true and skip next rule
RewriteRule [A-Z].*?\.aspx$ - [E=HASCAPS:TRUE,S=1]

# Skip this entire section if no uppercase letters in requested URL
RewriteRule !\.aspx$ - [S=29]
RewriteRule ![A-Z] - [S=28]

# Replace single occurance of CAP with cap, then process next Rule.
RewriteRule ^([^A]*)A(.*)$ $1a$2
RewriteRule ^([^B]*)B(.*)$ $1b$2
RewriteRule ^([^C]*)C(.*)$ $1c$2
RewriteRule ^([^D]*)D(.*)$ $1d$2
RewriteRule ^([^E]*)E(.*)$ $1e$2
RewriteRule ^([^F]*)F(.*)$ $1f$2
RewriteRule ^([^G]*)G(.*)$ $1g$2
RewriteRule ^([^H]*)H(.*)$ $1h$2
RewriteRule ^([^I]*)I(.*)$ $1i$2
RewriteRule ^([^J]*)J(.*)$ $1j$2
RewriteRule ^([^K]*)K(.*)$ $1k$2
RewriteRule ^([^L]*)L(.*)$ $1l$2
RewriteRule ^([^M]*)M(.*)$ $1m$2
RewriteRule ^([^N]*)N(.*)$ $1n$2
RewriteRule ^([^O]*)O(.*)$ $1o$2
RewriteRule ^([^P]*)P(.*)$ $1p$2
RewriteRule ^([^Q]*)Q(.*)$ $1q$2
RewriteRule ^([^R]*)R(.*)$ $1r$2
RewriteRule ^([^S]*)S(.*)$ $1s$2
RewriteRule ^([^T]*)T(.*)$ $1t$2
RewriteRule ^([^U]*)U(.*)$ $1u$2
RewriteRule ^([^V]*)V(.*)$ $1v$2
RewriteRule ^([^W]*)W(.*)$ $1w$2
RewriteRule ^([^X]*)X(.*)$ $1x$2
RewriteRule ^([^Y]*)Y(.*)$ $1y$2
RewriteRule ^([^Z]*)Z(.*)$ $1z$2

# If there are any uppercase letters, restart at very first RewriteRule in file.
RewriteRule [A-Z] - [N]

RewriteCond %{ENV:HASCAPS} TRUE
RewriteRule ^/?(.*) /$1 [R=301,L]