Ответ
Браузер определяет порт назначения на основе URL, следуя простым правилам:
Явное указание порта: Если порт указан в URL после домена через двоеточие (например,
https://example.com:8080
), браузер будет использовать именно этот порт.Порт по умолчанию (стандартный): Если порт в URL не указан, браузер использует стандартный порт для указанной схемы (протокола):
- Для
http://
— порт 80. - Для
https://
— порт 443.
- Для
Пример на Go
Этот код демонстрирует, как можно извлечь порт из URL, учитывая стандартные порты:
package main
import (
"fmt"
"log"
"net/url"
)
func getPort(rawURL string) (string, error) {
u, err := url.Parse(rawURL)
if err != nil {
return "", err
}
port := u.Port() // u.Port() вернет пустую строку, если порт не указан явно
if port != "" {
return port, nil
}
// Если порт не указан, определяем по схеме
if u.Scheme == "https" {
return "443", nil
}
// По умолчанию считаем http
return "80", nil
}
func main() {
port1, _ := getPort("https://example.com:8443/path")
fmt.Printf("URL: https://example.com:8443/path -> Port: %sn", port1) // Вывод: 8443
port2, _ := getPort("https://google.com")
fmt.Printf("URL: https://google.com -> Port: %sn", port2) // Вывод: 443
port3, _ := getPort("http://example.org")
fmt.Printf("URL: http://example.org -> Port: %sn", port3) // Вывод: 80
}
Важные нюансы
- CORS (Cross-Origin Resource Sharing): При работе с нестандартными портами браузеры применяют более строгие политики безопасности. Сервер должен быть корректно настроен для обработки запросов с других источников (origins), которые включают в себя схему, домен и порт.
- Файрволы: Корпоративные или личные файрволы могут блокировать трафик на нестандартные порты, разрешая только 80 и 443.