You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by "AlinsRan (via GitHub)" <gi...@apache.org> on 2026/08/06 04:44:25 UTC

[PR] fix: normalize the case of hosts carried on a service [apisix]

AlinsRan opened a new pull request, #13781:
URL: https://github.com/apache/apisix/pull/13781

   ### Description
   
   Hostnames are case-insensitive, and route matching runs against `$host`, which nginx always lowercases (`ngx_http_validate_host()`). `apisix/router.lua` normalizes this on the route object:
   
   ```lua
   if route.value.host then
       route.value.host = str_lower(route.value.host)
   elseif route.value.hosts then
       for i, v in ipairs(route.value.hosts) do
           route.value.hosts[i] = str_lower(v)
       end
   end
   ```
   
   `apisix/http/service.lua` has no equivalent, so `service.hosts` is stored verbatim. `radixtree_host_uri` — the default router — builds its host buckets itself, keyed on the raw reversed host string:
   
   ```lua
   -- apisix/http/router/radixtree_host_uri.lua
   for i, host in ipairs(hosts) do
       local host_rev = host:reverse()
   ```
   
   A service host containing an uppercase character therefore ends up in a bucket keyed on e.g. `moc.elpmaxe.esaCdexiM`, which the lowercase `$host` can never reach. The route falls through to `only_uri_router`, and if nothing host-agnostic matches, the request 404s — for every path and every casing of the request `Host`, so the host is silently unroutable.
   
   `radixtree_uri` is not affected, because it passes `hosts` to lua-resty-radixtree, which lowercases on both the config side and the request side.
   
   Reproduced on 3.16.0 in standalone mode, with `service.hosts: ["MixedCase.example.com"]` and a route with no `hosts` of its own:
   
   | request `Host` | `radixtree_host_uri` (default) | `radixtree_uri` | after this patch |
   | --- | --- | --- | --- |
   | `MixedCase.example.com` | 404 | 200 | 200 |
   | `mixedcase.example.com` | 404 | 200 | 200 |
   | `MIXEDCASE.EXAMPLE.COM` | 404 | 200 | 200 |
   
   This patch lowercases the hosts in the service `filter()`, mirroring what `router.lua` already does for routes.
   
   Found via apache/apisix-ingress-controller#2822: the controller carries the host constraint on the service object, so an ingress route with an uppercase hostname is unroutable.
   
   #### Which issue(s) this PR fixes:
   
   N/A
   
   ### Checklist
   
   - [x] I have explained the need for this PR and the problem it solves
   - [x] I have explained the changes or the new features added to this PR
   - [x] I have added tests corresponding to this change
   - [ ] I have updated the documentation to reflect this change
   - [x] I have verified that this change is backward compatible (If not, please discuss on the [APISIX mailing list](https://github.com/apache/apisix/tree/master#community) first)
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] fix: normalize the case of hosts carried on a service [apisix]

Posted by "AlinsRan (via GitHub)" <gi...@apache.org>.
AlinsRan merged PR #13781:
URL: https://github.com/apache/apisix/pull/13781


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org