【问题标题】:Using Apache htaccess file to change URL to lowercase使用 Apache htaccess 文件将 URL 更改为小写
【发布时间】:2014-03-05 18:59:03
【问题描述】:

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

“如果 URL 以 .aspx 结尾,则将整个 URL 重写为小写。”

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

提前致谢。

【问题讨论】:

  • askapache.com/htaccess/rewrite-uppercase-lowercase.html 如果您无权访问 Aapche 服务器配置(共享访问)
  • 这似乎非常接近我的需要,但似乎没有提供有关如何以 URL 中存在“.aspx”为条件进行重写的指导。
  • ok 在下面发布了答案。

标签: apache .htaccess


【解决方案1】:

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

RewriteMap lc int:tolower

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

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

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

【讨论】:

  • 我应该更具体一点 - 我在共享主机环境中。我很抱歉。那么,没有办法单独通过 .htaccess 来实现吗?
  • 我在使用此代码时面临的问题是,在我的网络应用程序中,我使用了一些 css 、js、大写图像的名称。所以它使请求的文件名成为小,他们不渲染。你知道我该怎么做吗
【解决方案2】:

如果您不在共享主机环境中并且乐于将规则直接输入到您的 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 重写和 PHPTaken 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 小 sn-p!
这是一个名为 rewrite-strtolower.php 的文件,位于与上述 .htaccess 文件相同的目录中。

【讨论】:

  • 我应该更具体一点 - 我在共享主机环境中。我很抱歉。那么,没有办法单独通过 .htaccess 来实现吗?
  • 是的,这是可能的,但是我的 php 代码,您只需转换为 asp。现在我编辑答案。
【解决方案3】:

试试这个代码:

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]

【讨论】:

  • 没错,但是服务器响应请求的 url 很慢。
  • 嗯,如果您的 URI 很长,那么可能会有些慢,但这是主要解决方案的解决方法。
  • “哦,这实际上非常快,不会减慢任何速度。” @askapache.com/htaccess/rewrite-uppercase-lowercase
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-14
  • 1970-01-01
相关资源
最近更新 更多