【问题标题】:Convert Rewrite Rule Prefix Matching from Apache to Nginx将重写规则前缀匹配从 Apache 转换为 Nginx
【发布时间】:2016-10-12 05:34:25
【问题描述】:

如何将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;
   ...
}

【问题讨论】:

    标签: apache nginx url-rewriting


    【解决方案1】:

    您的rewrite 还不错。它会起作用的。唯一的问题是人们更喜欢nginx 中的return 指令,因为它更快一些(nginx 需要做的处理更少)。


    我对@9​​87654325@ 重写不是很熟悉,所以我对它们的解释可能略有错误,但我相信您只想在/test1/foo/bar 下使用rewrite URL。为此,您甚至不需要rewrite 指令,您可以在nginx 中使用简单的return 来实现它

    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
    }
    

    使用regex 会慢一些:

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

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

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

    【讨论】:

    • @Kokizzu - 正确。 location /test1 是一个前缀匹配,将匹配/test1/aaaa。此外,$request_uri 将包含 doiman 之后的所有内容(即/test/aaaa)。
    猜你喜欢
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2016-08-09
    • 1970-01-01
    • 2012-08-25
    • 1970-01-01
    相关资源
    最近更新 更多