Ticket: HEL-685
Date: 2026-04-08
All Service Delivery pages return 404 in production. College Outcomes is likely broken for the same reason. Two-line nginx fix restores routing with zero downtime — only the nginx container needs to restart.
docker/nginx.conf has:
location "/Service Delivery/" { proxy_pass http://evidence-service; }
Browsers always send /Service%20Delivery/ (percent-encoded). Nginx prefix location matching is literal — it does not decode %20 → space before comparing. The location never matches. Requests fall through to location / → evidence-finance → 404 (finance has no Service Delivery pages).
Confirmed in nginx access log:
GET /Service%20Delivery/contact_health ... 404
The map block for /_app/ asset routing has the same bug:
"~*/Service Delivery/" evidence-service;
The $http_referer header also contains %20, so this pattern never matches either — meaning JS assets for Service Delivery pages are also routed to the wrong container.
docker/nginx.conf — 2 changes:
# Before
"~*/Service Delivery/" evidence-service;
"~*/College Outcomes/" evidence-outcomes;
# After
~*Service%20Delivery evidence-service;
~*College%20Outcomes evidence-outcomes;
# Before
location "/Service Delivery/" { proxy_pass http://evidence-service; }
location "/College Outcomes/" { proxy_pass http://evidence-outcomes; }
# After
location ~ "^/Service%20Delivery/" { proxy_pass http://evidence-service; }
location ~ "^/College%20Outcomes/" { proxy_pass http://evidence-outcomes; }
Only the nginx container needs to rebuild — Evidence containers are unaffected:
# On 62.171.177.227, in the compose project dir:
docker compose build nginx
docker compose up -d --no-deps nginx
Or just push and trigger a Coolify redeploy of the nginx service only.
docker/nginx.conf — fix 4 lines (2 in map block, 2 location blocks)evidence.sayhellocollege.com/Service%20Delivery/contact_health returns 200evidence.sayhellocollege.com/College%20Outcomes/ returns 200