diff --git a/httpx/client.py b/httpx/client.py
index 590d5d0..4991478 100644
--- a/httpx/client.py
+++ b/httpx/client.py
@@ -330,6 +330,11 @@ class BaseClient:
 
         url = URL(location, allow_relative=True)
 
+        # Handle malformed 'Location' headers that are "absolute" form, have no host.
+        # See: https://github.com/encode/httpx/issues/771
+        if url.scheme and not url.host:
+            url = url.copy_with(host=request.url.host)
+
         # Facilitate relative 'Location' headers, as allowed by RFC 7231.
         # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource')
         if url.is_relative_url:
diff --git a/httpx/models.py b/httpx/models.py
index acaaf66..8d22738 100644
--- a/httpx/models.py
+++ b/httpx/models.py
@@ -201,7 +201,7 @@ class URL:
             or "port" in kwargs
         ):
             host = kwargs.pop("host", self.host)
-            port = kwargs.pop("port", self.port)
+            port = kwargs.pop("port", None if self.is_relative_url else self.port)
             username = kwargs.pop("username", self.username)
             password = kwargs.pop("password", self.password)
 
@@ -216,7 +216,10 @@ class URL:
 
             kwargs["authority"] = authority
 
-        return URL(self._uri_reference.copy_with(**kwargs).unsplit())
+        return URL(
+            self._uri_reference.copy_with(**kwargs).unsplit(),
+            allow_relative=self.is_relative_url,
+        )
 
     def join(self, relative_url: URLTypes) -> "URL":
         """

Handle redirects with missing hostname in `Location:`  header.
While doing something like this:

```
import httpx

def run_sync(url):
    with httpx.Client(verify=False) as client:
        response = client.get(url)
        print(response)

run_sync('http://62.28.16.253')
```

I get a `httpx.exceptions.InvalidURL: No host included in URL.`

However `curl -vLk http://62.28.16.253` works like normal, as well as other HTTP clients. I think this might be another sketchy server misconfiguration, but should work nonetheless.
diff --git a/tests/client/test_redirects.py b/tests/client/test_redirects.py
index eab44f0..1717d78 100644
--- a/tests/client/test_redirects.py
+++ b/tests/client/test_redirects.py
@@ -56,6 +56,10 @@ class MockDispatch(AsyncDispatcher):
             headers = {"location": "/"}
             return Response(codes.SEE_OTHER, headers=headers, request=request)
 
+        elif request.url.path == "/malformed_redirect":
+            headers = {"location": "https://:443/"}
+            return Response(codes.SEE_OTHER, headers=headers, request=request)
+
         elif request.url.path == "/no_scheme_redirect":
             headers = {"location": "//example.org/"}
             return Response(codes.SEE_OTHER, headers=headers, request=request)
@@ -176,6 +180,16 @@ async def test_relative_redirect():
     assert len(response.history) == 1
 
 
+@pytest.mark.usefixtures("async_environment")
+async def test_malformed_redirect():
+    # https://github.com/encode/httpx/issues/771
+    client = AsyncClient(dispatch=MockDispatch())
+    response = await client.get("http://example.org/malformed_redirect")
+    assert response.status_code == codes.OK
+    assert response.url == URL("https://example.org/")
+    assert len(response.history) == 1
+
+
 @pytest.mark.usefixtures("async_environment")
 async def test_no_scheme_redirect():
     client = AsyncClient(dispatch=MockDispatch())

pip install -e .[dev]
parse_log_pytest
requirements.txt
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
aspy.refactor-imports==3.0.2
attrs==25.3.0
autoflake==2.3.1
babel==2.17.0
backrefs==5.8
black==25.1.0
brotlipy==0.7.0
certifi==2025.1.31
cffi==1.17.1
chardet==3.0.4
charset-normalizer==3.4.1
click==8.1.8
colorama==0.4.6
coverage==7.8.0
cryptography==44.0.2
exceptiongroup==1.2.2
flake8==7.2.0
flake8-bugbear==24.12.12
flake8-pie==0.16.0
ghp-import==2.1.0
h11==0.9.0
h2==3.2.0
hpack==3.0.0
hstspreload==2025.1.1
-e git+https://github.com/encode/httpx.git@5a63540e8ab35209849894819ac731c836fdcf27#egg=httpx
hyperframe==5.2.0
idna==2.10
importlib_metadata==8.6.1
iniconfig==2.1.0
isort==6.0.1
Jinja2==3.1.6
Markdown==3.7
MarkupSafe==3.0.2
mccabe==0.7.0
mergedeep==1.3.4
mkautodoc==0.2.0
mkdocs==1.6.1
mkdocs-get-deps==0.2.0
mkdocs-material==9.6.10
mkdocs-material-extensions==1.3.1
mypy==1.15.0
mypy-extensions==1.0.0
outcome==1.3.0.post0
packaging==24.2
paginate==0.5.7
pathspec==0.12.1
platformdirs==4.3.7
pluggy==1.5.0
pycodestyle==2.13.0
pycparser==2.22
pyflakes==3.3.2
Pygments==2.19.1
pymdown-extensions==10.14.3
pytest==8.3.5
pytest-asyncio==0.26.0
pytest-cov==6.0.0
pytest-trio==0.8.0
python-dateutil==2.9.0.post0
PyYAML==6.0.2
pyyaml_env_tag==0.1
requests==2.32.3
rfc3986==1.5.0
seed-isort-config==2.2.0
six==1.17.0
sniffio==1.3.1
sortedcontainers==2.4.0
tomli==2.2.1
trio==0.29.0
trustme==1.2.1
typing_extensions==4.13.0
urllib3==1.26.20
uvicorn==0.34.0
watchdog==6.0.0
zipp==3.21.0

name: httpx
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - aspy-refactor-imports==3.0.2
      - attrs==25.3.0
      - autoflake==2.3.1
      - babel==2.17.0
      - backrefs==5.8
      - black==25.1.0
      - brotlipy==0.7.0
      - certifi==2025.1.31
      - cffi==1.17.1
      - chardet==3.0.4
      - charset-normalizer==3.4.1
      - click==8.1.8
      - colorama==0.4.6
      - coverage==7.8.0
      - cryptography==44.0.2
      - exceptiongroup==1.2.2
      - flake8==7.2.0
      - flake8-bugbear==24.12.12
      - flake8-pie==0.16.0
      - ghp-import==2.1.0
      - h11==0.9.0
      - h2==3.2.0
      - hpack==3.0.0
      - hstspreload==2025.1.1
      - hyperframe==5.2.0
      - idna==2.10
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - isort==6.0.1
      - jinja2==3.1.6
      - markdown==3.7
      - markupsafe==3.0.2
      - mccabe==0.7.0
      - mergedeep==1.3.4
      - mkautodoc==0.2.0
      - mkdocs==1.6.1
      - mkdocs-get-deps==0.2.0
      - mkdocs-material==9.6.10
      - mkdocs-material-extensions==1.3.1
      - mypy==1.15.0
      - mypy-extensions==1.0.0
      - outcome==1.3.0.post0
      - packaging==24.2
      - paginate==0.5.7
      - pathspec==0.12.1
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - pycodestyle==2.13.0
      - pycparser==2.22
      - pyflakes==3.3.2
      - pygments==2.19.1
      - pymdown-extensions==10.14.3
      - pytest==8.3.5
      - pytest-asyncio==0.26.0
      - pytest-cov==6.0.0
      - pytest-trio==0.8.0
      - python-dateutil==2.9.0.post0
      - pyyaml==6.0.2
      - pyyaml-env-tag==0.1
      - requests==2.32.3
      - rfc3986==1.5.0
      - seed-isort-config==2.2.0
      - six==1.17.0
      - sniffio==1.3.1
      - sortedcontainers==2.4.0
      - tomli==2.2.1
      - trio==0.29.0
      - trustme==1.2.1
      - typing-extensions==4.13.0
      - urllib3==1.26.20
      - uvicorn==0.34.0
      - watchdog==6.0.0
      - zipp==3.21.0
prefix: /opt/conda/envs/httpx

tests/client/test_redirects.py::test_malformed_redirect[asyncio] tests/client/test_redirects.py::test_malformed_redirect[trio]
tests/client/test_redirects.py::test_no_redirect[asyncio] tests/client/test_redirects.py::test_no_redirect[trio] tests/client/test_redirects.py::test_redirect_301[asyncio] tests/client/test_redirects.py::test_redirect_301[trio] tests/client/test_redirects.py::test_redirect_302[asyncio] tests/client/test_redirects.py::test_redirect_302[trio] tests/client/test_redirects.py::test_redirect_303[asyncio] tests/client/test_redirects.py::test_redirect_303[trio] tests/client/test_redirects.py::test_disallow_redirects[asyncio] tests/client/test_redirects.py::test_disallow_redirects[trio] tests/client/test_redirects.py::test_relative_redirect[asyncio] tests/client/test_redirects.py::test_relative_redirect[trio] tests/client/test_redirects.py::test_no_scheme_redirect[asyncio] tests/client/test_redirects.py::test_no_scheme_redirect[trio] tests/client/test_redirects.py::test_fragment_redirect[asyncio] tests/client/test_redirects.py::test_fragment_redirect[trio] tests/client/test_redirects.py::test_multiple_redirects[asyncio] tests/client/test_redirects.py::test_multiple_redirects[trio] tests/client/test_redirects.py::test_too_many_redirects[asyncio] tests/client/test_redirects.py::test_too_many_redirects[trio] tests/client/test_redirects.py::test_too_many_redirects_calling_next[asyncio] tests/client/test_redirects.py::test_too_many_redirects_calling_next[trio] tests/client/test_redirects.py::test_redirect_loop[asyncio] tests/client/test_redirects.py::test_redirect_loop[trio] tests/client/test_redirects.py::test_redirect_loop_calling_next[asyncio] tests/client/test_redirects.py::test_redirect_loop_calling_next[trio] tests/client/test_redirects.py::test_cross_domain_redirect[asyncio] tests/client/test_redirects.py::test_cross_domain_redirect[trio] tests/client/test_redirects.py::test_same_domain_redirect[asyncio] tests/client/test_redirects.py::test_same_domain_redirect[trio] tests/client/test_redirects.py::test_body_redirect[asyncio] tests/client/test_redirects.py::test_body_redirect[trio] tests/client/test_redirects.py::test_no_body_redirect[asyncio] tests/client/test_redirects.py::test_no_body_redirect[trio] tests/client/test_redirects.py::test_can_stream_if_no_redirect[asyncio] tests/client/test_redirects.py::test_can_stream_if_no_redirect[trio] tests/client/test_redirects.py::test_cannot_redirect_streaming_body[asyncio] tests/client/test_redirects.py::test_cannot_redirect_streaming_body[trio] tests/client/test_redirects.py::test_cross_subdomain_redirect[asyncio] tests/client/test_redirects.py::test_cross_subdomain_redirect[trio] tests/client/test_redirects.py::test_redirect_cookie_behavior[asyncio] tests/client/test_redirects.py::test_redirect_cookie_behavior[trio]
httpx/models.py httpx/client.py
httpx/models.py httpx/client.py