mod_rewrite 规则

mod_rewrite 规则

我需要一个 mod_rewrite 规则,将所有请求发送到 index.php,除非请求是针对 /media/ 文件夹中的任何内容。

我对 lighttpd 有类似的规则,但是我对 regex/mod_rewrite 了解不够,无法为 Apache 更改它。

        url.rewrite-once = (
            "/(media)/(.*)" => "/$1/$2",
            "^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3",
    )

谢谢

答案1

对 Redmumba 的回答进行一些更正......

RewriteEngine on
RewriteMap esc int:escape
RewriteCond $0 !^/media/
RewriteRule .* /index.php?url=$0\%3f${esc:%{QUERY_STRING}} [B]

使用$0反向引用而不是%{PATH_INFO}引用输入路径。在 中RewriteRule,添加B标志以再次转义 URL(如mod_rewrite 文档)。规则的其余部分用于对原始查询字符串进行双重转义,以便当参数urlindex.php.

或者,如果您index.php希望直接使用其查询字符串,而不是从参数内部对其进行解码url,则可以使用

RewriteEngine on
RewriteCond $0 !^/media/
RewriteRule .* /index.php?url=$0 [B,QSA]

url这实际上是对 LighTTPD 重写规则的更忠实的翻译,但如果输入查询字符串本身包含参数,则可能会发生冲突。

答案2

基本上,您将要执行完全相同的操作,只是调用RewriteRule而不是url.rewrite-once。此外,可以对两者进行的一项改进是使用 来RewriteCond匹配媒体部分。

RewriteEngine on
RewriteCond %{PATH_INFO} !^/media/.*
RewriteRule ^([^\?]*)(\?(.+))?$ /index.php?url=$1&$3

这样,您就不必重写 /media 的规则——它会检查它是否不以 开头/media,然后重写它。如果是这样,它就会将其传递下去。

希望这可以帮助!

相关内容