Apache: OPTIONS * mod_jk ellen

 ( NevemTeve | 2018. szeptember 6., csütörtök - 11:06 )

Ki lehet a hibás, ha ilyen üzenet van a mod_jk.log fájlban:

[Thu Sep 06 10:40:14.221 2018] [942126:1] 
[emerg] jk_servlet_normalize::jk_util.c (2188): [*] does not start with '/'.

httpd: Apache/2.4.34
mod_jk: tomcat-connectors-1.2.44

Ugyebár beérkezik a klienstől, hogy "OPTIONS *", erre a httpd konzultál a mod_jk-val, hogy az óhajt-e valamit kezdeni vele, a mod_jk meg elsősorban arra panaszol, hogy mit csináljon ő egy csillaggal, amikor eddig abban hitben élt, hogy ottan egy path-név jön, /perjellel kezdve.

Szerk: Mondjuk egy 'AllowMethods GET POST' valószínűleg segítene rajta...

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

subs. Hogy te mindig talalsz valamit :)
____________________
echo crash > /dev/kmem

A kliens küldhet OPTIONS *-ot, ez kifejezetten le van írva a specifikációban.

An OPTIONS request with an asterisk ("*") as the request-target
(Section 5.3 of [RFC7230]) applies to the server in general rather
than to a specific resource. Since a server's communication options
typically depend on the resource, the "*" request is only useful as a
"ping" or "no-op" type of method; it does nothing beyond allowing the
client to test the capabilities of the server. For example, this can
be used to test a proxy for HTTP/1.1 conformance (or lack thereof).

Mivel ez nem a resource-ra vonatkozik (amit ugye a mod_jk-val kéne kiszolgálni), hanem magára a szerverre, itt igazából azt tesztelné le a kliens, hogy helyesen proxyzik-e a proxy. És nem. A mod_jk helyes működése ugyebár az Apache felelősségi köre, de hibásan működik. Szerintem jelentsd be.
Az URI definícióban a lehetőségek között ki van fejtve az RFC7230-ban, hogy a * mint URI miként kell, hogy viselkedjen proxyk esetén:

If a proxy receives an OPTIONS request with an absolute-form of
request-target in which the URI has an empty path and no query
component, then the last proxy on the request chain MUST send a
request-target of "*" when it forwards the request to the indicated
origin server.

For example, the request

OPTIONS http://www.example.org:8001 HTTP/1.1

would be forwarded by the final proxy as

OPTIONS * HTTP/1.1
Host: www.example.org:8001

after connecting to port 8001 of host "www.example.org".

Szóval szerintem a mod_jk-nak nem szabadna az OPTIONS *-ot elvetnie, és át kéne dobnia a kiszolgált servlethez, pontosan ugyanígy.
Maga az Apache core helyesen működik, de a mod_jk bugos, a kliens pedig teljesen jó requestet küld, a mod_jk-nak nem szabadna feltételeznie, hogy mindenképpen /-rel kezdődik a request, mert ez nem igaz.

Szerintem amúgy egy Tomcatet ne mod_jk-val proxyzz, hanem sima HTTP proxyzással.
Az AllowMethod meg szerintem kifejezetten ellenjavalt, az OPTIONS egy totál értelmes HTTP method, főleg, ha RESTful service-d van.

Ki fogsz nevetni, de eddig valahogy úgy képzeltem, hogy a httpd maga dönti el (mondjuk a JkMount-ok alapján), hogy melyik requesteket kell a mod_jk-nak lepasszolni, és melyeket nem... Most viszont úgy tűnik, tévedtem: a derék mod_jk kikerülhetetlenül befúrja magát a történetbe, tehát a * is eljut hozzá.

Szerk: elfelejtettem mondani, hogy számos JkMount van, de egyik sem 'globális' érvényű -- persze ez most nem jelentős, mert már az előzetes szintaktikai ellenőrzés dobja a hibát.

Szerk: De azért nincs akkor baj, hogy még egy if-fel ne lehessen kezelni:
https://bz.apache.org/bugzilla/show_bug.cgi?id=62689

Off: Mondjuk azért kíváncsi vagyok, milyen információt lehetne egy ilyen OPTIONS *-ra küldeni... eddig kb ennyi jutott eszembe:

HTTP/1.1 200 OK
Date: Fri, 07 Sep 2018 09:43:17 GMT
Server: Na persze
Content-Length: 0
Connection: close