mod_rewrite规则,如何测试'not a string'?

时间:2009-08-30 22:41:13

标签: apache mod-rewrite

我在www.foo.com/wp/上安装了一个博客,并希望所有转到任何不以/ wp /开头的页面的请求都被重定向到www.foo.com/wp/(没有保存网址。)

E.g:

www.foo.com/bar/baz/hello.gif     > www.foo.com/wp/

另外,与此同时,我需要URL来拥有www。如果没有添加(这可能是我的规则混淆的地方)

目前,我有:

RewriteCond %{HTTP_HOST}      !^www.foo.com [NC]
RewriteCond %{HTTP_HOST}      !^$
RewriteRule ^/(.*)            http://www.foo.com/$1 [R=permanent]

RewriteRule ^(?!wp)/(.*)$               http://%{HTTP_HOST}/wp/($2) [R=permanent]

但我认为目前这已完全打破。

非常感谢。

2 个答案:

答案 0 :(得分:1)

RewriteCond %{HTTP_HOST}      !^www.foo.com [NC]
RewriteCond %{HTTP_HOST}      !^$
RewriteRule (.*)              http://www.foo.com/$1 [R=permanent,L]

RewriteRule ^(?!wp/)(.*)      http://%{HTTP_HOST}/wp/$1 [R=permanent]
  1. 匹配的网址的路径部分从不具有前导斜杠,您无需锚定.*
  2. L modified会在您到达第一次重定向后阻止重写继续。
  3. 负面观察(?!)不是捕获构造,您可以通过编写$1而不是($1)替换捕获的模式。
  4. 编辑:显然对于OP,最后一条规则不起作用,无法排除以/wp/开头的情况,这对我来说没有任何意义。这是尝试解决方法:

    RewriteCond %{HTTP_HOST}      !^www.foo.com [NC]
    RewriteCond %{HTTP_HOST}      !^$
    RewriteRule (.*)              http://www.foo.com/$1 [R=permanent,L]
    
    RewriteCond %{REQUEST_URI}    !^/wp/
    RewriteRule (.*)              http://%{HTTP_HOST}/wp/$1 [R=permanent]
    

答案 1 :(得分:0)

请尝试以下规则:

RewriteCond %{HTTP_HOST} !^www.exmaple.com [NC]
RewriteCond %{HTTP_HOST} !^$
RewriteRule ^ http://www.example.com%{REQUEST_URI} [R=301,L]

RewriteCond %{THE_REQUEST} ^GET\ /wp/
RewriteRule ^wp/(.*) /$1 [R=301,L]

RewriteRule !^wp/ wp%{REQUEST_URI} [L]

第一条规则是主机名。第二种是从外部删除/wp路径前缀。第三种是再次为内部重定向添加前缀。