【问题标题】:Remove parameters within nginx rewrite移除 nginx rewrite 中的参数
【发布时间】:2012-03-27 08:23:03
【问题描述】:

我在重新启动后在 nginx 中重写 URL。在旧网站中,我在 URL 中有查询参数来过滤内容,例如

http://www.example.com/mypage.php?type=4

新页面没有这些参数。我想删除它们并将 URL 重写到主页,以便我得到:

http://www.example.com/mypage/

我在nginx中的重写规则是:

location ^~ /mypage.php {
    rewrite ^/mypage.php$ http://www.example.com/mypage permanent;
}

但是在这个规则下,参数仍然是附加的。我认为$ 会阻止 nginx 处理进一步的值......有什么想法吗?所有其他问题都涉及如何添加参数 - 我只想删除我的:)

【问题讨论】:

    标签: get nginx rewrite


    【解决方案1】:

    遇到类似问题,经过大量搜索,rewrite docs 中出现了答案。

    如果您指定 ?在重写结束时,Nginx 将删除原始的 $args(参数)

    因此,对于您的示例,这可以解决问题:

    location ^~ /mypage.php {
        rewrite ^/mypage.php$ http://www.example.com/mypage? permanent;
    }
    

    【讨论】:

    • 你的阅读能力比我好;)非常感谢!
    • 我想删除一个特定的参数怎么办。
    • 等等,这条规则不会导致重定向循环吗?
    • 即使您的目的地有一个查询字符串也可以使用:rewrite ^/abc$ example.com/a?b=c?永久的;
    【解决方案2】:

    要从 URL 中删除参数,在本例中为 coupon=xxx

    if ($query_string ~ "^(.*)coupon=(.*)$") {
        rewrite ^(.*)$ $uri? permanent;
    }
    

    请注意,如果 语句匹配。 $uri 是原始请求,不带参数。

    【讨论】:

      【解决方案3】:

      尝试将$args 变量设置为该位置内的空。

      set $args '';
      

      【讨论】:

      • 这会破坏这种你想使用查询参数值添加新标头的操作:proxy_set_header Authorization "Bearer $arg_token";
      【解决方案4】:

      如果要从url中删除指定的参数,

      #  in location directive: 
      if ($request_uri ~ "([^\?]*)\?(.*)unwanted=([^&]*)&?(.*)") {
          set $original_path $1; 
          set $args1 $2; 
          set $unwanted $3; 
          set $args2 $4; 
          set $args ""; 
      
          rewrite ^ "${original_path}?${args1}${args2}" permanent;
      }
      

      然后访问 your_site.com/a=1&unwanted=2&c=3

      第 1 步。服务器返回 302 响应,表示 url 匹配。

      第二步。客户端用新的url重新发送请求(去掉参数)

      【讨论】:

      • 在 Nginx 世界中,IF 条件不被认为是邪恶的吗?
      • 注意。使用break; 而不是permanent; 在浏览器中保持相同的url。
      • @KhomNazid,只有当你将它们用于其他然后重写的事情时,它们才是邪恶的。见:nginx.com/resources/wiki/start/topics/depth/ifisevil/…
      【解决方案5】:

      如果我们附加一个 ?到目的地的末尾,它将阻止查询被附加到目的地。 :)

      Example Source Args Destination
      Keep the arg appended rewrite ^/mypage.php$ arg=something https://example.com/new-page/
      Do not preserve the arg rewrite ^/mypage.php$ arg=something https://example.com/new-page/?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 2014-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多