Метод воспроизводства: 1) ставим и приводим в рабочее состояние alterator-fbi 2) редактируем httpd2.alterator.conf, добавляем строки: ErrorDocument 400 "https://localhost:8080/fbi-bin/" ErrorDocument 404 "https://localhost:8080/fbi-bin/" Смотрим: curl -kv https://localhost:8080/dsalkfjslkjf - поле Location в заголовках, отданных сервером - появляется. Затем идёт HTML о необходимости сделать редирект. смотрим: curl -kv http://localhost:8080/dsalkfjslkjf - заголовки от сервера не приходят вообще, открывается сразу HTML о необходимости сделать редирект После исправления этой ошибки можно будет сделать редирект с http://localhost:8080/ на https://localhost:8080/ при обращении к alterator-fbi
Created attachment 1913 [details] apache2-2.2.4-alt-headers.ErrorDocument-0.1.patch Патч для вывода отладки ap_send_error_response.
После прикладывания apache2-2.2.4-alt-headers.ErrorDocument-0.1.patch (http://git.altlinux.org/people/solo/packages/?p=apache2.git;a=commit;h=6d9794b7d7df70303c40a03a2c654e32591364d4) видно, что при звпросах вида "curl -kv http://localhost:8080/dsalkfjslkjf" при вызове функции ap_send_error_response условие (!r->assbackwards) не выполняется (соответственно заголовки не генерируются): [Thu Apr 19 19:10:38 2007] [info] [client 127.0.0.1] SSL handshake failed: HTTP spoken on HTTPS port; trying to send HTML error page [Thu Apr 19 19:10:38 2007] [info] SSL Library Error: 336027804 error:1407609C:SSL routines:SSL23_GET_CLIENT_HELLO:http request speaking HTTP to HTTPS port!? [Thu Apr 19 19:10:38 2007] [debug] http_protocol.c(1107): ap_send_error_response: start [Thu Apr 19 19:10:38 2007] [debug] http_protocol.c(1323): ap_send_error_response: END. При запросах вида "curl -kv https://localhost:8080/dsalkfjslkjf", ap_send_error_response отрабатывает так: [Thu Apr 19 19:10:18 2007] [info] Initial (No.1) HTTPS request received for child 0 (server worksol.spb.altlinux.org:443) [Thu Apr 19 19:10:18 2007] [error] [client 127.0.0.1] File does not exist: /var/www/html/alkjdakshdasd [Thu Apr 19 19:10:18 2007] [debug] http_protocol.c(1107): ap_send_error_response: start [Thu Apr 19 19:10:18 2007] [debug] http_protocol.c(1160): ap_send_error_response: (!r->assbackwards) is TRUE. [Thu Apr 19 19:10:18 2007] [debug] http_protocol.c(1176): ap_send_error_response: (ap_is_HTTP_REDIRECT(status) || (status == HTTP_CREATED)) is TRUE. [Thu Apr 19 19:10:18 2007] [debug] http_protocol.c(1181): ap_send_error_response: ((location != NULL) && *location) is TRUE. [Thu Apr 19 19:10:18 2007] [debug] http_protocol.c(1214): ap_send_error_response: (apr_table_get(r->subprocess_env, "suppress-error-charset") != NULL) is FALSE. [Thu Apr 19 19:10:18 2007] [debug] http_protocol.c(1323): ap_send_error_response: END.
Похоже, что r->assbackwards выставляется в read_request_line (в файле server/protocol.c)...
Created attachment 1926 [details] apache2-2.2.4-alt-headers.ErrorDocument-0.2.patch Состав патча apache2-2.2.4-alt-headers.ErrorDocument-0.2.patch (http://git.altlinux.org/people/solo/packages/?p=apache2.git;a=commit;h=3005718e5b8415d000ad1431c1d4286acae40edb): 1. Генерация кучи отладочных сообщений 2. _Грязный_ хак на modules/ssl/ssl_engine_io.c: в макросе HTTP_ON_HTTPS_PORT тип протакола прописан _явно_, как HTTP/1.1. Использование п. 2 что позволяет корректно выстовить r->assbackwards (при запросе по HTTP/1.1, если обращение идёт по другому протоколу, например по HTTP/0.9 -- сеё вызовет ошибку), что в свою очередь -- вызывает появление в ответе некоторых заголовков. Location при этом непоявляется, т. к. ответ сервера идёт с r->status='400'... На данный момент непонятно 2 вещи: 1. Как выставить правельный протокол для ответа. (Точнее, как понять что за протокол использовался при запросе.) 2. Где и как выставляется r->status...
(In reply to comment #4) > Created an attachment (id=1926) [edit] > apache2-2.2.4-alt-headers.ErrorDocument-0.2.patch apache2-2.2.4-alt22.debug.1, собранный с данным патчем: http://git.altlinux.org/people/solo/packages/?p=apache2.git;a=commit;h=4f50edcd75dcae65f6c3967b3086e16d79b8276e
Похоже нужный статус невыстовляется в ap_read_request: входящий запрос невыдерживает проверки на корректность ходеров, а mod_ssl при обращении по http, их непринимает вообще...
Похоже надо врезаться в ssl_io_filter_error и заменять HTTP_ON_HTTPS_PORT_BUCKET(f->c->bucket_alloc) на реально принятое сервером. Как получить реальное значение я непонял. Задачу откладываю.
Судя по faq.altlinux.ru (там чуть другая проблемка -- с чарсетом), у apache1 тоже с https и хедерами не всё гладко... OTOH альтератор съехал на свой httpd.
всё уже неактуально