Fix: FastDL 404 / Missing .bz2 File Errors

January 29, 2026 Daemon666 8 min read 4 преглеждания

You set up FastDL, but clients still fail to download and the console shows repeated 404 responses, or the server never offloads to HTTP at all. FastDL is just a web server hosting your game files at the URL in sv_downloadurl; a 404 means the client asked for a path that does not resolve on that web server. The fix is making the on-disk layout, the URL, and the file compression line up exactly with what the engine requests.

1. Know the exact URL the client builds

Given sv_downloadurl "http://dl.example.com/cs", the engine appends the full game-relative path including cstrike/. So for a map it requests:

http://dl.example.com/cs/cstrike/maps/de_rats.bsp

The single most common 404 cause is a web root missing that cstrike/ level, or doubling it (cs/cstrike/cstrike/...). Your document root under /cs must contain a cstrike/ directory that mirrors the server's, so the path above resolves to a real file.

2. Understand the .bz2 fallback

FastDL is faster when files are pre-compressed with bzip2. The client first asks for the .bz2, and only if that 404s does it ask for the raw file:

GET /cs/cstrike/maps/de_rats.bsp.bz2   -> 404
GET /cs/cstrike/maps/de_rats.bsp       -> 200

A 404 on the .bz2 alone is not fatal — the client falls back to the uncompressed file. A problem exists only when both 404. So if downloads work but your logs are full of .bz2 404s, you simply have not pre-compressed the files; the transfers still succeed, just larger. To get the speed benefit, compress each servable file (keeping the original too):

bzip2 -k cstrike/maps/de_rats.bsp
# produces de_rats.bsp.bz2 alongside the original

Then copy both to the mirror. The -k keeps the source file so the raw fallback still exists.

3. Fix the web server MIME/type handling

Some web servers refuse to serve .bsp or .bz2 because the extension is not in their MIME map, returning a 403 or a broken transfer. Serve them as generic binary. For Nginx:

location /cs/ {
    types { }
    default_type application/octet-stream;
    autoindex off;
}

For Apache, ensure the directory allows access and that no handler intercepts these extensions. The goal is that the web server treats .bsp, .bz2, .mdl, .spr, .wav as plain downloadable files.

4. Match case and path exactly

Linux web servers are case-sensitive. If the map is de_rats.bsp on the game server but De_Rats.bsp on the mirror, every request 404s. The map name the server references, the file on the mirror, and the URL must match character for character. This also bites when a plugin references a sound in one case and the file is stored in another.

5. Confirm the file is actually on the mirror

FastDL cannot serve what is not there. Every custom resource — maps, models, sprites, sounds, skyboxes — that the game server has must also be copied to the mirror under the same relative path. A file present on the game server but not synced to the web root 404s for every client. Keep the mirror in step with your custom-content as you add maps.

A reliable pattern is to sync the game server's cstrike/maps, cstrike/models, cstrike/sound, cstrike/sprites and cstrike/gfx folders to the mirror with rsync after every content change, and to run the bzip2 compression step as part of that sync so the .bz2 variants never drift out of date. If you compress once and then add maps, the new maps have no .bz2 — harmless, but you lose the speed benefit until you recompress.

Common errors

  • Every file 404s — the cstrike/ level is missing or doubled in the web root. The URL must resolve to a real file including cstrike/.
  • Only .bz2 404s, downloads still work — files are not pre-compressed. Harmless, but compress them for speed.
  • 403 instead of 404 — the web server blocks the extension or directory. Serve as application/octet-stream and allow the path.
  • Some maps 404, others fine — case mismatch or a file never synced to the mirror.
  • Server never uses HTTP at allsv_downloadurl is empty or unreachable; it fell back to the slow UDP transfer.

Verification

Paste the exact URL the client would request into a browser:

http://dl.example.com/cs/cstrike/maps/de_rats.bsp

It must download (200), not 404. Try the .bz2 too — if it 200s, compression is in place; if it 404s but the raw file downloads, you are fine but uncompressed. Then delete the map from a test client and connect: the console should show a 200 fetch over HTTP rather than a slow in-game transfer. When the browser resolves the path and the client pulls the file fast, FastDL is correct.

Сътрудници: Daemon666 ✦
Сподели: