mod_rewrite规则

我需要一个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开始,然后重写它。 如果是这样,它只是传递它。

希望这可以帮助!