Tên máy chủ phải khớp với cú pháp sau:
hostname = domainlabel [ "." ] | 1*( domainlabel "." ) toplabel [ "." ]
domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
toplabel = alpha | alpha *( alphanum | "-" ) alphanum
Như bạn có thể thấy, chỉ .và -được cho phép,_ là không.
Sau đó, bạn nói rằng //5-12-145-35_s-81:443được cho phép, và nó là, nhưng không phải cho tên máy chủ .
Để xem làm thế nào mà chảo ra:
URI uriBadHost = URI.create("//5-12-145-35_s-81:443");
System.out.println("uri = " + uriBadHost);
System.out.println(" authority = " + uriBadHost.getAuthority());
System.out.println(" host = " + uriBadHost.getHost());
System.out.println(" port = " + uriBadHost.getPort());
URI uriGoodHost = URI.create("//example.com:443");
System.out.println("uri = " + uriGoodHost);
System.out.println(" authority = " + uriGoodHost.getAuthority());
System.out.println(" host = " + uriGoodHost.getHost());
System.out.println(" port = " + uriGoodHost.getPort());
Đầu ra
uri = //5-12-145-35_s-81:443
authority = 5-12-145-35_s-81:443
host = null
port = -1
uri = //example.com:443
authority = example.com:443
host = example.com
port = 443
Như bạn có thể thấy, khi authoritycó tên máy chủ hợp lệ, hostvàport được phân tích cú pháp, nhưng khi không hợp lệ, authoritynó được coi là văn bản dạng tự do và không được phân tích cú pháp nữa.
CẬP NHẬT
Từ bình luận:
System.out.println( new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null))đầu ra: /// 5-12-145-35_s-81: 443. Tôi đang đặt nó làm tên máy chủ
Các URI tạo bạn đang gọi là một phương thức tiện lợi và đơn giản nó xây dựng một chuỗi URI đầy đủ và sau đó phân tích cú pháp đó.
Đi qua "5-12-145-35_s-81", 443trở thành //5-12-145-35_s-81:443.
Vượt qua "/5-12-145-35_s-81", 443trở thành///5-12-145-35_s-81:443 .
Đầu tiên, nó là một máy chủ và cổng , và không thể phân tích cú pháp.
Trong phần thứ hai, phần thẩm quyền là trống rỗng, và /5-12-145-35_s-81:443là một con đường .
URI uri1 = new URI(null, null, "/5-12-145-35_s-81", 443, null, null, null);
System.out.println("uri = " + uri1);
System.out.println(" authority = " + uri1.getAuthority());
System.out.println(" host = " + uri1.getHost());
System.out.println(" port = " + uri1.getPort());
System.out.println(" path = " + uri1.getPath());
Đầu ra
uri = ///5-12-145-35_s-81:443
authority = null
host = null
port = -1
path = /5-12-145-35_s-81:443