我需要一个mod_rewrite规则,将所有请求发送到index.php,除非请求是针对/ media /文件夹中的任何内容。
我有一个lighttpd类似的规则,但我不知道正则expression式/ mod_rewrite更改为Apache。
url.rewrite-once = ( "/(media)/(.*)" => "/$1/$2", "^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3", )
谢谢
纠正Redmumba的回答
RewriteEngine on RewriteMap esc int:escape RewriteCond $0 !^/media/ RewriteRule .* /index.php?url=$0\%3f${esc:%{QUERY_STRING}} [B]
使用$0
反向引用而不是%{PATH_INFO}
来引用inputpath。 在RewriteRule
,添加B
标志以再次转义URL(如mod_rewrite文档中所述 )。 规则的其余部分是双重转义的原始查询string,以便它可以恢复时url
参数由您的index.php
转义。
或者,如果你的index.php
希望直接使用它的查询string,而不是从url
参数中解码,你可以使用
RewriteEngine on RewriteCond $0 !^/media/ RewriteRule .* /index.php?url=$0 [B,QSA]
这实际上是LighTTPD重写规则的更忠实的翻译,但是如果input的查询string本身包含url
参数,则可能会发生冲突。
基本上,你会做同样的事情,只调用RewriteRule
而不是url.rewrite-once
。 另外,两者都可以改进的地方是使用RewriteCond
来匹配媒体部分。
RewriteEngine on RewriteCond %{PATH_INFO} !^/media/.* RewriteRule ^([^\?]*)(\?(.+))?$ /index.php?url=$1&$3
这样,你就不必重写/ media的规则了 – 这个检查是不是以/media
开始,然后重写它。 如果是这样,它只是传递它。
希望这可以帮助!