Как браузер определяет порт для HTTP/HTTPS запроса?

Ответ

Браузер определяет порт назначения на основе URL, следуя простым правилам:


  1. Явное указание порта: Если порт указан в URL после домена через двоеточие (например, https://example.com:8080), браузер будет использовать именно этот порт.


  2. Порт по умолчанию (стандартный): Если порт в 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.