我在nginx中考虑了potential trailing hostname dot handling in two contexts,并且很好奇是否需要使用任何一个来完全正确的配置:
server_name ~^(\w+)\.(example\.com)\.?$;
if ($host ~ ^(\w*)\.(example\.com)\.?$) {
答案 0 :(得分:0)
不,在任何一个上下文中都没有必要 - 在$host
variable和server_name
directive的上下文中,nginx会自动处理尾随点,只留下{{3}带有额外的点(如果在请求中存在)。
我相信它已在$http_host
variable中实施:
1925 if (dot_pos == host_len - 1) {
1926 host_len--;
1927 }
可以使用以下最小配置进行验证:
server {
listen [::]:7325;
server_name ~^(\w*)\.?(example\.com\.?)$;
return 200 C:$2\tH:$host\tHH:$http_host\tSN:$server_name\n;
}
针对nginx/1.2.1
运行以下测试:
%printf 'GET / HTTP/1.0\nHost: head.example.com.\n\n' | nc localhost 7325 | fgrep example
C:example.com H:head.example.com HH:head.example.com. SN:~^(\w*)\.?(example\.com\.?)$
%
%printf 'GET http://line.example.com./ HTTP/1.0\n\n' | nc localhost 7325 | fgrep example
C:example.com H:line.example.com HH: SN:~^(\w*)\.?(example\.com\.?)$
%
%printf 'GET http://line.example.com./ HTTP/1.0\nHost: head.example.com.\n\n' | nc localhost 7325 | fgrep example
C:example.com H:line.example.com HH:head.example.com. SN:~^(\w*)\.?(example\.com\.?)$
%
请注意,server_name
指令中的正则表达式捕获和$host
变量都没有尾随点。因此,在上述情况下考虑它是没有意义的。