4

当我转到 test.com/123456 时,我正在尝试将 nginx 中的 url 重定向到非 http 协议,例如 test://123456

我尝试了以下重写:rewrite ^/(.*)$ test://$1 Permanent;

但是它的工作原理是它添加了 html/body 标头的奇怪部分,这会弄乱我的代码,没有 html 标头或任何其他推荐的重写方法有什么办法吗?

HTTP/1.1 301 Moved Permanently  
Server: nginx/1.1.19 
Date: Tue, 30 Apr 2013 14:14:47 GMT 
Content-Type: text/html 
Content-Length: 185  
Connection: keep-alive
Location: test://123456

<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.1.19</center>
</body>
</html>
4

1 回答 1

1

这并不奇怪,这就是它应该的样子。

RFC 2616指定应该存在您要删除的实体主体。

10.3.2 301 永久移动

新的永久 URI 应该由响应中的 Location 字段给出。除非请求方法是 HEAD,否则响应的实体应该包含一个简短的超文本注释,其中包含指向新 URI 的超链接。

和...

10.3.3 302 找到

临时 URI 应该由响应中的 Location 字段给出。除非请求方法是 HEAD,否则响应的实体应该包含一个简短的超文本注释,其中包含指向新 URI 的超链接。

在这种情况下,应该在RFC 2119中定义:

这个词或形容词“推荐”意味着在特定情况下可能存在忽略特定项目的正当理由,但在选择不同的课程之前必须理解并仔细权衡全部含义。

答案取自NGINX 301 和 302 服务小型 nginx 文档正文。有什么办法可以消除这种行为?


当然你仍然可以这样做,一种可能性是代理请求并将请求方法从 GET 更改为 HEAD。这应该确保只发送 HTTP 标头。

这是未经测试的,但它应该是一个很好的起点:

server {
    listen 8080;
    server_name localhost;
    return 301 test://$request_uri;
}

server {
    listen 80;
    server_name example.com;
    location / {
        proxy_method HEAD;
        proxy_pass http://localhost:8080;
    }
}

同样出于对这个上下文的兴趣,NGINX 将 HEAD 转换为 GET 请求

于 2013-05-01T12:18:23.393 回答