【问题标题】:Lighttpd rewriting files and directoriesLighttpd 重写文件和目录
【发布时间】:2011-02-12 16:52:49
【问题描述】:

我正在尝试使用 Lighttpd 进行 url 重写。我有我需要的部分工作。现在我有这个: http://domain.com/name/a/123 重写为 http://domain.com/name/a.php?pid=123

我使用此重写一次规则来执行此操作:"^/name/a/([^/]+)"=> "/name/a.php?pid=$1"

该 php 页面具有未被重写的外部资源,例如 JavaScript 和 CSS 文件。有没有办法我也可以让重写执行以下操作?

http://domain.com/name/a/js/file.js => http://domain.com/name/js/file.js

【问题讨论】:

    标签: regex mod-rewrite rewrite lighttpd


    【解决方案1】:

    如下所示的重写规则应该可以完成这项工作。在 perl 语法中,假设 $str 包含 http://domain.com/name/a/js/file.js

       $str =~ s/\/a\//\//
    

    从为部分工作的正则表达式给出的正则表达式语法推断,在 Lighthttpd 中,这应该映射到

      "/a/"=>"/"
    

    它的作用是查找“/a/”并将其替换为“/”。将此应用于您的示例 (http://domain.com/name/a/js/file.js) 会得到 http://domain.com/name/js/file.js

    【讨论】:

    • 我在想,如果我可以做一个匹配整个字符串的正则表达式,如果它有一个 / 应该可以工作。所以我的规则就像.. "^/name/a/(match / here)" => "/name/$1" 不过我不确定如何匹配整个输入字符串。
    • 编写匹配 a/ 的正则表达式很容易编写,但从您的问题来看,您似乎想以 2 种不同的方式重写字符串。我给你的正则表达式解决了第二种类型的重写。另外,看看你部分工作的正则表达式,你确定正则表达式 ^/name/a/([^/]+)=>"/name/a.php?pid=$1 重写domain.com/name/a/123。正则表达式会尝试匹配 /name/.. 在字符串的开头。我认为您需要删除插入符号(^)。
    • 您是否正在寻找一个正则表达式来进行两种重写?如果是这样,这是不可能的。在第一个实例中,您希望将 name/a/123 转换为 name/a.php?pid=$1。 $1 将捕获括号中正则表达式匹配的子字符串。原始字符串不包含文本 a.php?pid,因此您永远无法从原始字符串中捕获它
    • 不,我要找两个。我尝试了您的建议,但没有奏效。
    • 尝试转义星号,据此 (redmine.lighttpd.net/wiki/1/Docs:ModRewrite),* 和 + 都需要转义。此外,如果在您的输入中我们总是有 a/ 即 a 后跟一个正斜杠,您可以完全摆脱 [^/]*。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多