如何修改Apache上的.htaccess文件以执行以下操作:
“如果网址以.aspx结尾,请将整个网址重写为小写。”
背景故事:我最近将一个网站从ASPX托管迁移到Linux / Apache托管。野外有一些旧的URL(营销材料),我需要确保这些URL仍然有用; Windows Web服务器不区分大小写,但Linux Web服务器是。
提前致谢。
答案 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]