Настройте Apache для передачи хеш-символа в CGI-скрипты как часть QUERY_STRING - PullRequest
0 голосов
/ 27 января 2019

Я работаю над эмуляцией встроенного устройства, которым управляют с помощью команд HTML.Контроллер выдает URL-адреса, такие как

http://192.168.0.10/cgi-bin/aw_cam?cmd=QFT&res=1

, и это определенным образом влияет на устройство.Моя цель - сделать эмулятор устройства, поэтому мне нужно захватывать и обрабатывать все такие запросы.Я успешно настроил Apache для вызова моих сценариев, и я могу получить доступ к управляющей строке «cmd = QFT & res = 1», прочитав значение QUERY_STRING.Я использую Apache 2.4.18 в Ubuntu 16.04.5.Сценарии написаны на C ++.

Проблема, с которой я сталкиваюсь, заключается в том, что некоторые из команд, выданных контроллером, имеют следующую форму:

http://192.168.0.10/cgi-bin/aw_ptz?cmd=#P80&res=1
http://192.168.0.10/cgi-bin/aw_ptz?cmd=#T50&res=1  

По любой причине, кто бы ни проектировалструктура команды решила использовать символ # как часть команды.Но так как '#' разграничивает часть фрагмента URL, информация после этого никогда не попадает в мой скрипт, который получает только «cmd =»

Есть ли способ заставить Apache передать всю строкупосле ?к моим сценариям?Я не могу изменить клиента или протокол, только на стороне сервера.

Редактировать: Журнал apache показывает весь URL-адрес (см. Часть файла журнала ниже), поэтому, хотя # должен быть разделителем фрагмента,по крайней мере, он попадает в файл журнала, но не в скрипт cgi.

192.168.0.9 - - [27/Jan/2019:00:21:10 +0000] "GET /cgi-bin/aw_ptz?cmd=#P53&res=1 HTTP/1.0" 200 151 "-" "-"
192.168.0.9 - - [27/Jan/2019:00:21:11 +0000] "GET /cgi-bin/aw_ptz?cmd=#P66&res=1 HTTP/1.0" 200 151 "-" "-"
192.168.0.9 - - [27/Jan/2019:00:21:11 +0000] "GET /cgi-bin/aw_ptz?cmd=#P99&res=1 HTTP/1.0" 200 151 "-" "-"
192.168.0.9 - - [27/Jan/2019:00:21:11 +0000] "GET /cgi-bin/aw_ptz?cmd=#P76&res=1 HTTP/1.0" 200 151 "-" "-"

1 Ответ

0 голосов
/ 28 января 2019

Это похоже на работу:

RewriteCond %{THE_REQUEST} \s(.*)#(.*)\s
RewriteRule ^ http://localhost:8000%1#%2 [P,NE]
ProxyPass / http://localhost:8000/
ProxyPassReverse / http://localhost:8000/

(у меня был Python простой http-сервер, прослушивающий localhost: 8000, чтобы проверить, правильно ли был передан хэш

...