Apache es el front-end para mi aplicación web, entonces yo uso mod_rewrite para proxy de la solicitud de JBoss. Hasta ahora esto suena bastante estándar, pero el problema que estoy teniendo es: si puedo acceder a la aplicación directamente a través de JBoss @http://localhost:8080/app/page?raw=foo%26bar&page=1
:Apache/mod_rewrite> Tomcat codificación% 26 y "&"
request.getParameter("raw") = foo&bar
Si puedo acceder a la aplicación a través de Apache @http://localhost/foo%26bar&page=1
request.getParameter("raw") = foo
por lo en algún momento, la %26
se pierde y se sustituye con un &
la que taja la variable prima.
Ésta es mi regla de reescritura de Apache.
RewriteRule ^/(.*) \
http://localhost:8080/app/home?raw=$1 [L,P]
El registro de acceso de Apache muestra: http://localhost/foo%26bar&page=1
Y el registro de reescritura muestra: http://localhost:8080/app/home?raw=foo&bar&page=1
, pero quiero que la solicitud sea: http://localhost:8080/app/home?raw=foo%26bar&page=1
Estoy bastante seguro de que esto ocurre también con barras /
también, así que para mí esto es un problema de codificación. ¿Hay alguna forma de proxy de la URL intacta? Parece que no puede resolver esto.
EDIT:
Lo primero que me gustaría decir es gracias a Gumbo por darme algunas sugerencias muy buenas! Basado en esas sugerencias, simplifiqué mi configuración de Apache para fines de prueba.
Esto es lo que parece:
ServerRoot "C:/apps/xampplite/apache"
Listen 80
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule log_config_module modules/mod_log_config.so
ServerAdmin [email protected]
ServerName localhost:80
DocumentRoot "C:/apps/xampplite/htdocs"
ErrorLog "logs/error.log"
LogLevel debug
DefaultType text/plain
<IfModule log_config_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
<IfModule logio_module>
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
</IfModule>
CustomLog "logs/access.log" combined
</IfModule>
RewriteEngine On
RewriteLog "C:/apps/xampplite/apache/logs/rewrite.log"
RewriteLogLevel 9
RewriteMap escape int:escape
RewriteRule ^/(.*) http://localhost:8080/app/home?raw=${escape:$1} [L,P]
Éstos son los pasos que di inicio: Apache, ir a
http://localhost/foo%26bar&page=1
en mi navegador web, deje de Apache.
entradas del registro de acceso: las entradas de registro
::1 - - [15/Mar/2010:19:17:18 -0400] "GET /foo%26bar&page=1 HTTP/1.1" 403 224 "-" "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6"
reescritura: entradas de registro
::1 - - [15/Mar/2010:19:17:18 --0400] [localhost/sid#54d160][rid#5e1360/initial] (2) init rewrite engine with requested uri /foo&bar&page=1
::1 - - [15/Mar/2010:19:17:18 --0400] [localhost/sid#54d160][rid#5e1360/initial] (3) applying pattern '^/(.*)' to uri '/foo&bar&page=1'
::1 - - [15/Mar/2010:19:17:18 --0400] [localhost/sid#54d160][rid#5e1360/initial] (5) map lookup OK: map=escape key=foo&bar&page=1 -> val=foo&bar&page=1
::1 - - [15/Mar/2010:19:17:18 --0400] [localhost/sid#54d160][rid#5e1360/initial] (2) rewrite '/foo&bar&page=1' -> 'http://localhost:8080/app/home?raw=foo&bar&page=1'
::1 - - [15/Mar/2010:19:17:18 --0400] [localhost/sid#54d160][rid#5e1360/initial] (3) split uri=http://localhost:8080/app/home?raw=foo&bar&page=1 -> uri=http://localhost:8080/app/home, args=raw=foo&bar&page=1
::1 - - [15/Mar/2010:19:17:18 --0400] [localhost/sid#54d160][rid#5e1360/initial] (2) forcing proxy-throughput with http://localhost:8080/app/home
de error:
[Mon Mar 15 19:16:56 2010] [notice] Apache/2.2.12 (Win32) configured -- resuming normal operations
[Mon Mar 15 19:16:56 2010] [notice] Server built: Jul 22 2009 11:35:54
[Mon Mar 15 19:16:56 2010] [notice] Parent: Created child process 2324
[Mon Mar 15 19:16:56 2010] [debug] mpm_winnt.c(487): Parent: Sent the scoreboard to the child
[Mon Mar 15 19:16:57 2010] [notice] Child 2324: Child process is running
[Mon Mar 15 19:16:57 2010] [debug] mpm_winnt.c(408): Child 2324: Retrieved our scoreboard from the parent.
[Mon Mar 15 19:16:57 2010] [info] Parent: Duplicating socket 148 and sending it to child process 2324
[Mon Mar 15 19:16:57 2010] [info] Parent: Duplicating socket 140 and sending it to child process 2324
[Mon Mar 15 19:16:57 2010] [debug] mpm_winnt.c(605): Parent: Sent 2 listeners to child 2324
[Mon Mar 15 19:16:57 2010] [debug] mpm_winnt.c(564): Child 2324: retrieved 2 listeners from parent
[Mon Mar 15 19:16:57 2010] [notice] Child 2324: Acquired the start mutex.
[Mon Mar 15 19:16:57 2010] [notice] Child 2324: Starting 64 worker threads.
[Mon Mar 15 19:16:57 2010] [notice] Child 2324: Starting thread to listen on port 80.
[Mon Mar 15 19:16:57 2010] [notice] Child 2324: Starting thread to listen on port 80.
[Mon Mar 15 19:17:18 2010] [error] [client ::1] attempt to make remote request from mod_rewrite without proxy enabled: proxy:http://localhost:8080/app/home
[Mon Mar 15 19:17:52 2010] [notice] Parent: Received shutdown signal -- Shutting down the server.
[Mon Mar 15 19:17:52 2010] [notice] Child 2324: Exit event signaled. Child process is ending.
[Mon Mar 15 19:17:52 2010] [info] Child 2324: Accept thread exiting.
[Mon Mar 15 19:17:53 2010] [notice] Child 2324: Released the start mutex
[Mon Mar 15 19:17:53 2010] [info] Child 2324: Accept thread exiting.
[Mon Mar 15 19:17:53 2010] [info] Child 2324: 64 threads blocked on the completion port
[Mon Mar 15 19:17:54 2010] [notice] Child 2324: All worker threads have exited.
[Mon Mar 15 19:17:54 2010] [notice] Child 2324: Child process is exiting
[Mon Mar 15 19:17:54 2010] [notice] Parent: Child process exited successfully.
[Mon Mar 15 19:17:54 2010] [info] removed PID file C:/apps/xampplite/apache/logs/httpd.pid (pid=1424)
Es interesante que la primera entrada en el registro de acceso muestra el% 26 y desapareció en la primera entrada del registro de reescritura.
Todavía desconcertado por este ...
Traté: RewriteRule ^/(. *) \ http : // localhost: 8080/app/home? raw = $ 1 [NE, L, P] Sin suerte, la entrada del registro de reescritura es la misma que sin el indicador NE. ¿Quizás la bandera está en el lugar equivocado? – user293479
Eso parecía prometedor pero aún no tuvo suerte. He aumentado el nivel de registro en Apache/reescritura y descubrí algo ... La primera línea es el siguiente: init reescribir motor con solicitado URI/foo & Bar & page = 1 ¿no significa esto que ya estamos trabajando con una cadena manipulada? ¿No debería ser todavía/foo% 26bar & page = 1 en este punto? Además en los registros podemos ver el escape: mapa de búsqueda OK: mapa = tecla de escape = foo y bar & page = 1 -> val = foo & Bar & page = 1 pero parece que hay nada que hacer porque el% 26 ya se convirtió en &. – user293479
@ user293479: ¿Utiliza alguna otra regla? – Gumbo