Apache / mod_rewrite> Tomcat с кодировкой% 26 и "&" - PullRequest
5 голосов
/ 14 марта 2010

Apache - это интерфейс моего веб-приложения, тогда я использую mod_rewrite, чтобы передать запрос в JBoss. Пока это звучит довольно стандартно, но проблема, с которой я сталкиваюсь, заключается в следующем: если я получаю доступ к приложению напрямую через jboss @ http://localhost:8080/app/page?raw=foo%26bar&page=1:

request.getParameter("raw") = foo&bar

Если я получаю доступ к приложению через Apache @ http://localhost/foo%26bar&page=1

request.getParameter("raw") = foo

Так что где-то по пути %26 теряется и заменяется на &, который прерывает необработанную переменную.

Это мое правило переписывания Apache.

RewriteRule ^/(.*) \
    http://localhost:8080/app/home?raw=$1 [L,P]

Журнал доступа Apache показывает: http://localhost/foo%26bar&page=1

И журнал перезаписи показывает: http://localhost:8080/app/home?raw=foo&bar&page=1

Но я хочу, чтобы запрос был: http://localhost:8080/app/home?raw=foo%26bar&page=1

Я почти уверен, что это также происходит с косыми чертами /, так что для меня это какая-то проблема кодирования. Есть ли способ прокси URL-адреса нетронутым? Не могу понять это.

EDIT:

Первое, что я хотел бы сказать, это спасибо Гамбо за то, что он дал мне очень хорошие предложения! Основываясь на этих предложениях, я упростил настройку Apache для тестирования.

Вот как это выглядит:

ServerRoot "C:/apps/xampplite/apache"
Listen 80

LoadModule rewrite_module modules/mod_rewrite.so
LoadModule log_config_module modules/mod_log_config.so

ServerAdmin postmaster@localhost
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]

Вот шаги, которые я предпринял: Запустите Apache, перейдите к

http://localhost/foo%26bar&page=1

в моем веб-браузере, остановите Apache.

Доступ к записям журнала:

::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"

Переписать записи в журнале:

::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

Записи в журнале ошибок:

[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)

Интересно, что первая запись в журнале доступа показывает% 26, а в первой записи журнала перезаписи он пропал.

Все еще озадачен этим ...

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Это должно работать:

RewriteRule ^/(.*) http://localhost:8080/app/home?raw=$1 [B,NE,L,P]

Как следует это:

RewriteCond %{REQUEST_URI} ^/(.*)
RewriteRule ^/(.*) http://localhost:8080/app/home?raw=%1 [L,P]
1 голос
/ 14 марта 2010

Попробуйте с флагом NE , чтобы предотвратить экранирование этого символа:

RewriteRule ^/(.*) http://localhost:8080/app/home?raw=$1 [NE,L,P]

Редактировать Думаю, я ошибся. Вместо того, чтобы предотвращать экранирование значения, вам нужно принудительно экранировать. Попробуйте это с внутренней функцией escape:

RewriteMap escape int:escape
RewriteRule ^/(.*) http://localhost:8080/app/home?raw=${escape:$1} [L,P]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...