2016-06-11 116 views
1

如何将Apache的前缀匹配转换为Nginx?转换重写规则前缀从Apache到Nginx的匹配

RewriteCond %{REQUEST_URI} ^/test1 
RewriteRule ^(.*)$ http://newsite/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} ^/foo 
RewriteRule ^(.*)$ http://newsite/$1 [R=301,L] 

RewriteCond %{REQUEST_URI} ^/bar 
RewriteRule ^(.*)$ http://newsite/$1 [R=301,L] 

或者

RewriteRule ^/test1/(.*)$ http://newsite/test1/$1 [R=301,L] 
RewriteRule ^/foo/(.*)$ http://newsite/foo/$1 [R=301,L] 
RewriteRule ^/bar/(.*)$ http://newsite/bar/$1 [R=301,L] 

是不是这样呢?

location/{ 
    rewrite ^/(test1|foo|bar)/(.*)$ http://newsite/$1/$2 permanent; 
    ... 
} 

回答

1

您的rewrite并不差。它会工作。唯一的是人们更喜欢nginx中的return指令,因为它有点快(nginx需要做更少的处理)。


我不是很熟悉apache重写,所以我可能是我对他们的解释稍有不妥,但我相信,你只需要rewrite网址下/test1/foo/bar。为了这个目的,你甚至都不需要rewrite指令,你可以在nginx

location /test1 { 
    return 301 http://newsite$request_uri; 
} 
location /foo { 
    return 301 http://newsite$request_uri; 
} 
location /bar { 
    return 301 http://newsite$request_uri; 
} 
location/{ 
    ... # pages on this domain 
} 

用一个简单的return使其使用regex是慢一点:

location ~ /(test1|foo|bar) { 
    return 301 http://newsite$request_uri; 
} 

你也可以使用一个rewrite指令,如果你真的想要:

location ~ /(test1|foo|bar) { 
    rewrite^http://newsite$request_uri permanent; 
} 
+0

所以这也适用于'/ test1/aaaa'吗? – Kokizzu

+1

@Kokizzu - 正确。 'location/test1'是**前缀匹配**,并且将匹配'/ test1/aaaa'。此外,'$ request_uri'将包含doiman之后的所有内容(即'/ test/aaaa')。 – grochmal