Nginx重定向规则无效

时间:2019-06-08 04:49:20

标签: nginx redirect url-rewriting

尝试进行简单的重定向:

rewrite https://url.example.com(.*) https://example.com/plugins/url permanent;

无论何时url.example.com被击中,我都希望它重定向到该特定路径。

3 个答案:

答案 0 :(得分:0)

如果原始URL是https://url.example.comhttps://url.example.com/,则rewritelocation伪指令使用的规范化URI将是/。方案,主机名和查询字符串均已删除。

要永久重定向到具有不同主机名的URL:

使用rewrite(有关详细信息,请参见this document

rewrite ^/$ https://example.com/foo permanent;

或使用locationreturn(有关详细信息,请参见this document

location = / {
    return 301 https://example.com/foo;
}

第二种解决方案效率更高,因为没有要处理的正则表达式

如果原始URL包含查询字符串:除非添加了结尾的rewrite,否则?将自动附加它。 return不会,但是可以通过附加$is_args$args来添加。


如果方案和主机名未更改,则可以简化两个语句:

rewrite ^/$ /foo permanent;

或者:

location = / {
    return 301 /foo;
}

答案 1 :(得分:0)

您可以为example.com和plugin.example.com创建单独的服务器。并在plugin.example.com服务器内部创建重定向。

server {
    server_name plugin.example.com;
    return 301 https://example.com/plugin;
}

server {
    server_name example.com;
    root /home/www/example.com/public;
}

答案 2 :(得分:0)

从子域重定向到主站点上的子文件夹

您是否需要从子域重定向到主站点上的子文件夹?

  • 最好通过单独的server上下文和适当的server_name规范来实现。

  • 否则,您还可以通过针对if测试$host语句来做到这一点。

  • 正如在其他地方已经指出的那样,rewrite伪指令基于$uri运行,其中不包含主机名。


基于

server_name的匹配(推荐):

使用有限数量的主机名的硬编码重定向(推荐):

server {
    server_name     plugin.example.com;
    return  301     $scheme://example.com/plugin$request_uri;
}
server {
    server_name     about.example.com;
    return  301     $scheme://example.com/about$request_uri;
}

从任何子域到主域的基于正则表达式的重定向:

server {
    server_name     ~^(?:www\.)?(?<subdomain>.*)\.example\.com$;
    return  301     $scheme://example.com/$subdomain$request_uri;
}

基于正则表达式的从有限数量的子域到主域的重定向:

server {
    server_name     ~^(?:www\.)?(?<subdomain>plugin|about)\.example\.com$;
    return  301     $scheme://example.com/$subdomain$request_uri;
}


基于

if

基于if语句的重定向,带有硬编码的主机名:

server {
    server_name     .example.com;
    …
    if ($host = plugin.example.com) {
        return  301     $scheme://example.com/plugin$request_uri;
    }
    if ($host = about.example.com) {
        return  301     $scheme://example.com/about$request_uri;
    }
    …
}

基于if语句的重定向以及基于正则表达式的匹配:

server {
    server_name     .example.com;
    …
    if ($host ~ ^(?:www\.)?(?<subdomain>plugin|about)\.example\.com$) {
        return  301     $scheme://example.com/$subdomain$request_uri;
    }
    …
}

请参阅http://nginx.org/r/server_name,详细了解哪种方法最适合您。