我需要一个 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 文档)。规则的其余部分用于对原始查询字符串进行双重转义,以便当参数url
被index.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
,然后重写它。如果是这样,它就会将其传递下去。
希望这可以帮助!