如何将nginx重定向到非http而不包含html头部信息

4
我正在尝试在nginx中将url重定向到非http协议(如test:// 123456),当我访问test.com / 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>
1个回答

1
这并不奇怪,这就是它应该的样子。 RFC 2616规定,您想要删除的实体主体应该存在。

10.3.2 301永久移动

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

还有...

10.3.3 302找到

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

在这种情况下,“SHOULD”在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请求的内容感兴趣。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接