Hi,

I'm using Resin 3.1.10 and experience a very, very strange behavior with
Resin's PHP Admin console.
In a Nutshell:
Using a conditional rewrite for the resin-admin web-app changes the
getRealPath() when accessing /index.php from the original location to the
ROOT-Webapp

I was able to reproduce it on a clean installation.
That's how I did it:


1.) Created a dummy index.php file in ${resin.root}/webapps/ROOT.
This file just contains:

Welcome to dummy index.php of the ROOT Web-App. Your IP Address is <?php
echo $_SERVER["REMOTE_ADDR"]; ?>

2.) Modifying resin.conf:
- Added <resin:import> with messages and a rewrite condition.
- Removed <prologue> as I want to have no authentication in this bug
reproduction case

    <!-- configures the default host, matching any host name -->
    <host id="" root-directory=".">

      <resin:import path="${resin.root}/conf/fallback.conf"
optional="true"/>

      <!--
         - configures an explicit root web-app matching the
         - webapp's ROOT
        -->
      <web-app id="/" root-directory="webapps/ROOT"/>

      <web-app id="/resin-admin" root-directory="${resin.home}/php/admin">
      </web-app>


3.) Created file fallback.conf in folder ${resin.root}/conf
This file contains:

<host xmlns="http://caucho.com/ns/resin";
                  xmlns:resin="http://caucho.com/ns/resin/core";>

  <resin:message>External configuration read from '${__FILE__}'
...</resin:message>

    <resin:message>This Resin Instance is acting as Fallback</resin:message>
    <resin:message>External IP Addresses will be redirected to
www.google.com</resin:message>
    <resin:message>Certain IP Addresses are allowed to
access</resin:message>

      <rewrite-dispatch>
          <moved-permanently regexp="^/" target="http://www.google.com/";>
            <not>
              <or>
                <when remote-addr="127.0.0.1"/> <!-- Matching IP, should not
forward you to Google -->
                <!-- Usually further IPs, therefore the 'or' -->
              </or>
            </not>
          </moved-permanently>
      </rewrite-dispatch>

</host>


4.) Modified ${resin.home}/php/admin/WEB-INF/resin-web.xml
- Only the PHP Servlet is active
- Other authentication stuff has been removed

<web-app xmlns="http://caucho.com/ns/resin";
         xmlns:resin="http://caucho.com/ns/resin/core";>

  <servlet-mapping url-pattern="*.php"

servlet-class="com.caucho.quercus.servlet.QuercusServlet"/>
</web-app>



Expectation:
Accessing http://localhost:8080/resin-admin should serve
${resin.home}/php/admin/index.php

Actual Result:
The "index.php" from the ROOT Web-App is shown.

Welcome to dummy index.php of the ROOT Web-App. Your IP Address is 127.0.0.1



Then I've added finest debug logging in resin.conf like this:

   <log path='${resin.root}/logs/debug_full.log'
        level='finest'
        timestamp='[%Y-%m-%d %H:%M:%S.%s] {%{thread}} '
        format=" '${app.contextPath}' ${log.level} ${log.sourceClassName}
(${log.sourceMethodName}) ${log.message}">
     <logger name="com.caucho" level="finest"/>
   </log>


There are several interesting things in the debug log, here is only an
excerpt.
Please see how the getRealPath() changes:

[2010-06-25 17:49:43.138] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[1] GET /resin-admin/
HTTP/1.1
[2010-06-25 17:49:43.138] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[1] Remote-IP:
127.0.0.1:2510
[2010-06-25 17:49:43.138] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[1] Host:
localhost:8080
[2010-06-25 17:49:43.138] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[1] User-Agent:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.4) Gecko/20100611
Firefox/3.6.4 GTB7.0
...
[2010-06-25 17:49:43.138] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[1] Keep-Alive: 115
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[1] Connection:
keep-alive
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[1] Cache-Control:
max-age=0
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path / ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\
...
[2010-06-25 17:49:43.154] {http--8080-1$17388264}
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path /index.jsp ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\index.jsp
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path /index.php ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\index.php
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '/resin-admin' FINE
com.caucho.server.dispatch.ServletMapper (mapServlet) invoke (uri:/index.php
-> *.php)
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '' FINEST
com.caucho.server.rewrite.RewriteDispatch (map) rewrite-dispatch check uri
'/resin-admin/'
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '' FINER
com.caucho.server.rewrite.AbstractRuleWithConditions (map) match .*
'/resin-admin/' --> '/resin-admin/'
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '' FINER
com.caucho.server.dispatch.ServletInvocation (service) Dispatch '/index.php'
to com.caucho.server.rewrite.conditionfilterch...@e3fda4
[2010-06-25 17:49:43.154] {http--8080-1$17388264}  '' FINER
com.caucho.server.rewrite.ConditionFilterChain (doFilter) null ^/
'/resin-admin/' --> 'http://www.google.com/resin-admin/'
...
[2010-06-25 17:49:43.669] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path /index.php ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\webapps\ROOT\index.php
[2010-06-25 17:49:43.810] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work]
[2010-06-25 17:49:43.810] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work,prefix=_quercus._d_23a._ide._appsrv._bug._resin_22dpro_22d3__1__10._webapps._root]
[2010-06-25 17:49:43.826] {http--8080-1$17388264}  '/resin-admin' CONFIG
com.caucho.loader.ClassEntry (<clinit>) In-place class redefinition
(HotSwap) is available.
[2010-06-25 17:49:43.826] {http--8080-1$17388264}  '/resin-admin' FINE
com.caucho.quercus.page.ProPageManager (compilePage)
Quercus[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/webapps/ROOT/index.php] loading
precompiled page
[2010-06-25 17:49:43.873] {http--8080-1$17388264}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path / ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\webapps\ROOT\



And now the same request with disabled included fallback.conf containing the
conditional rewrite:


[2010-06-25 17:52:41.252] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[2] GET /resin-admin/
HTTP/1.1
[2010-06-25 17:52:41.252] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[2] Remote-IP:
127.0.0.1:2556
[2010-06-25 17:52:41.252] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[2] Host:
localhost:8080
[2010-06-25 17:52:41.252] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[2] User-Agent:
Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.4) Gecko/20100611
Firefox/3.6.4 GTB7.0
...
[2010-06-25 17:52:41.252] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[2] Pragma: no-cache
[2010-06-25 17:52:41.252] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[2] Cache-Control:
no-cache
[2010-06-25 17:52:41.268] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path / ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\
...
[2010-06-25 17:52:41.268] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path /index.jsp ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\index.jsp
[2010-06-25 17:52:41.268] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path /index.php ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\index.php
[2010-06-25 17:52:41.268] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.dispatch.ServletMapper (mapServlet) invoke (uri:/index.php
-> *.php)
[2010-06-25 17:52:41.268] {http--8080-2$25277396}  '' FINER
com.caucho.server.dispatch.ServletInvocation (service) Dispatch '/index.php'
to WebAppFilterChain[http://localhost:8080/resin-admin,
next=ServletFilterChain[*.php]]
...
[2010-06-25 17:52:41.658] {http--8080-2$25277396}  '/resin-admin' FINER
com.caucho.server.dispatch.ServletConfigImpl (createServlet) Servlet[*.php]
active
[2010-06-25 17:52:41.658] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.server.dispatch.ServletConfigImpl (createServlet)
javax.management.NotCompliantMBeanException:
resin:type=QuercusServlet,Host=default,WebApp=/resin-admin,name="\*.php"
mbean has no MBean interface
[2010-06-25 17:52:41.658] {http--8080-2$25277396}  '/resin-admin' FINER
com.caucho.server.dispatch.ServletConfigImpl (createServlet) Servlet[*.php]
active
[2010-06-25 17:52:41.674] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work]
[2010-06-25 17:52:41.799] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work,prefix=_quercus]
[2010-06-25 17:52:41.799] {resin-16}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work,prefix=_quercus]
[2010-06-25 17:52:41.830] {resin-16}  '/resin-admin' CONFIG
com.caucho.java.JavaCompiler (compileInt) Compiling
_quercus/_index__php.java
[2010-06-25 17:52:41.830] {Thread-4}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader JarLoader[]
...
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work,prefix=_quercus._web_22dinf._php]
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINER
com.caucho.webbeans.manager.WebBeansContainer (bind)
WebBeansContainer[system] bind(ServletAuthenticator) returns
SingletonComponent[ManagementAuthenticator, @Standard, name=resin-admin,
@SingletonScope]
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.security.AbstractLogin (getAuthenticator) BasicLogin[]
using ManagementAuthenticator[MD5-base64,resin]
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.connection.AbstractHttpRequest (isUserInRole) no user for
isUserInRole
...
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2] HTTP/1.1 302
Found
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2] Expires: 01
Dec 1994 16:00:00 GMT
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2] Cache-Control:
max-age=0,private
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2] Pragma:
No-Cache
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2] Location:
http://localhost:8080/resin-admin/status.php
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2] Content-Type:
text/html
[2010-06-25 17:52:41.862] {http--8080-2$25277396}  '/resin-admin' FINE
com.caucho.server.http.HttpResponse (writeHeadersInt) Http[2]
Content-Length: 0
[2010-06-25 17:52:41.893] {http--8080-2$25277396}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[2] keepalive
[2010-06-25 17:52:41.893] {http--8080-2$25277396}  '' FINE
com.caucho.server.port.TcpConnection (keepalive) Tcp[,2] keepalive (thread)
[2010-06-25 17:52:41.908] {http--8080-2$22322411}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[2] GET
/resin-admin/status.php HTTP/1.1
[2010-06-25 17:52:41.908] {http--8080-2$22322411}  '' FINE
com.caucho.server.http.HttpRequest (handleRequest) Http[2] Remote-IP:
127.0.0.1:2556
[2010-06-25 17:52:41.908] {http--8080-2$22322411}  '' FINE
com.caucho.server.http.HttpRequest (parseHeaders) Http[2] Host:
localhost:8080
,,,
[2010-06-25 17:52:41.908] {http--8080-2$22322411}  '/resin-admin' FINE
com.caucho.server.dispatch.ServletMapper (mapServlet) invoke
(uri:/status.php -> *.php)
[2010-06-25 17:52:41.908] {http--8080-2$22322411}  '' FINER
com.caucho.server.dispatch.ServletInvocation (service) Dispatch
'/status.php' to WebAppFilterChain[http://localhost:8080/resin-admin,
next=ServletFilterChain[*.php]]
[2010-06-25 17:52:41.908] {http--8080-2$22322411}  '/resin-admin' FINEST
com.caucho.server.webapp.WebApp (getRealPath) real-path /status.php ->
D:\IDE\Appsrv\BUG\resin-pro-3.1.10\php\admin\status.php
[2010-06-25 17:52:41.924] {http--8080-2$22322411}  '/resin-admin' FINEST
com.caucho.loader.DynamicClassLoader (addLoader) DynamicClassLoader[] adding
loader
SimpleLoader[/D:/IDE/Appsrv/BUG/resin-pro-3.1.10/php/admin/WEB-INF/work]
...

You see, it's working without that conditional rewrite.
It will also work when all the "*.php" Servlet Mappings for the
QuercusServlet are removed (app-default.xml and
php/admin/WEB-INF/resin-web.xml). Accessing /resin-admin will contain an
empty page with the php source.

So, there seems to be a connection between the conditional rewrite and the
QuercusServlet. Also other web-apps within that host behave normal.

When I change the condition in the rewrite clause to match, I will be
forwarded to google.com.

Any Idea how to work around that issue?

Thanks and best regards,
Steffen
_______________________________________________
resin-interest mailing list
resin-interest@caucho.com
http://maillist.caucho.com/mailman/listinfo/resin-interest

Reply via email to