Nginx$request\u uri具有重复的查询参数

Nginx$request\u uri具有重复的查询参数,nginx,Nginx,我发现nginx的$request\u uri与查询参数重复 我想实现的目标是将裸域的任何请求重定向到www域。下面是一个示例配置 server { listen 8080; server_name localhost; location / { if ($http_host !~* "^www\.") { rewrite (.*) http://www.$htt

我发现nginx的$request\u uri与查询参数重复

我想实现的目标是将裸域的任何请求重定向到www域。下面是一个示例配置

    server {
        listen       8080;
        server_name  localhost;    
        location / {
            if ($http_host !~* "^www\.") {
                rewrite (.*) http://www.$http_host$request_uri permanent;
            }
        }
    }
我得到的结果是:

curl -I http://127.0.0.1:8080/pp/\?a\=b

HTTP/1.1 301 Moved Permanently
Server: nginx/1.6.2
Date: Thu, 22 Jan 2015 04:07:39 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://www.127.0.0.1:8080/pp/?a=b?a=b
查询参数在结果中重复;我在这里遗漏了什么吗?

(不总是,但是)那么为什么不尝试返回301:

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

server {
  server_name www.example.com;
  root /var/www;
  location / {
    index index.html;
  }
}

您看到的查询参数的复制是Nginx的预期行为。要更改此设置,您需要在重写中添加一个尾随的
,如下所示:

   server {
        listen       8080;
        server_name  localhost;    
        location / {
            if ($http_host !~* "^www\.") {
                rewrite (.*) http://www.$http_host$request_uri? permanent;
            }
        }
    }

如果替换字符串包含新的请求参数,则 前面的请求参数将附加在它们之后。如果这是 不希望的,在替换字符串的末尾打问号 避免附加它们,例如:

重写^/users/(.*)$/show?user=$1?最后


但是,Aleksey Deryagin提供的配置对于您所需的重定向类型来说是更好、更有效的选择,因为无论是否需要,每个请求都将由原始配置中的
if
块进行评估

您找到解决方案了吗?应该移动到ServerFault。嗯,在我看来,它与
if
无关,而是更改
return 301
rewrite
指令。在我的情况下,我没有ifs,但重写是一样的,你的选择对我有效。知道为什么
return
有效而
rewrite
无效吗?您将如何使用
重写来编写此代码?return 301比rewrite更好,因此我在示例中使用return:)我改进了您的代码,使用
$scheme
而不是重定向URL中的硬编码
http://
,这样,该示例将无缝地适用于HTTP和HTTPS。官方文档说,在这种情况下最好使用
return
。如果您想测试重定向,请使用302而不是301,这样您的浏览器就不会缓存重定向。谢谢!只是想澄清一下:如果您将尾部的
添加到重写中,整个查询字符串将被剥离,或者它不会被复制?也就是说,如果后面有
,url会变成
http://www.127.0.0.1:8080/pp/?a=b
?@dgilperez URL将变成
http://www.127.0.0.1:8080/pp/?a=b
。添加尾随的
只会阻止再次添加查询字符串。不过,正如我在回答中提到的,在这种情况下使用重写方法并不是进行这种重定向的最有效方式。我的朋友@Dayo:我回复了你刚刚在我公司的联系表上发给我的电子邮件,我在这里复制了这封邮件:所以你在stackoverflow.com上发起了一次悬赏。你得到了一个正确的答案,但没有给予赏金。像你们这样的人让人觉得不愿意回答这样的问题。你真可耻!。没错,我忘了给你赏金了——你也花了5天的时间来回答我的澄清要求。你不必担心,赏金将在24小时内自动颁发。不过,我必须说:没有必要在我公司的网站上骚扰我。也就是说,至少可以说是幼稚和无用的。另外:我不知道赏金是否会自动授予你,这是我最初的预期,因为你的答案是最准确的。即使在采取了上述态度之后,情况仍然如此。这对我不起作用。我正在通过负载平衡器。这有区别吗?