Felix Schumacher wrote:
Am 19.02.2015 um 21:41 schrieb André Warnier:
Jérémie Barthés wrote:
...


Make a file rewrite.config in conf/Catalina/localhost/ that contains :
RewriteRule    ^/mypath/(.*)$    /examples/jsp/$1

copy the line
<Valve className="org.apache.catalina.valves.rewrite.RewriteValve" />
in the conf/server.xml file, line 131


Since this is a Valve, it will run before Tomcat attempts to match the URL to an actual directory or webapp.


try the followings URLs :


1) http://localhost:8080/mypath/async

This matches the rewrite rule, so it will be rewritten to URL

  /examples/jsp/async

Then Tomcat will attempt to match this to a directory or webapp, and find that (catalina_base)/webapps/examples/jsp/async is a directory.
It will thus respond to the browser with a 302 re-direct to

   http://localhost:8080/examples/jsp/async/

which is actually the "correct" URL.
And this is what will be shown in the browser URL bar. This, in my view, is expected behaviour. The server does that, so that when an actual response is generated (for the correct URL http://localhost:8080/examples/jsp/async/), the browser can cache this response under the correct URL.

Then the browser re-issues a request for

   http://localhost:8080/examples/jsp/async/

and that is when Tomcat will actually generate a "real" response, because this time it is a correct URL. So the response appears to the browser, as coming from

   http://localhost:8080/examples/jsp/async/

which is correct.

2) http://localhost:8080/mypath/async/

This also matches the rewrite rule, so it gets rewritten to

http://localhost:8080/examples/jsp/async/

which is a correct URL.
Thus Tomcat will immediately generate a real response (without an intermediate 302 redirect), which will be appear in the browser URL bar as a response to

http://localhost:8080/mypath/async/

This is also expected behaviour.

I believe that if you do not want to see the first redirect URL

   http://localhost:8080/examples/jsp/async/

in the browser, you have to modify your rewrite rules, perhaps by using a RewriteCond with the -d flag, to check first if the URL points to an existing directory, and if yes add the terminating "/" yourself (with a RewriteRule) before other rewrite tests/rules take place.
This rewrite.config

# if path doesn't end with a slash redirect it to an url with an ending slash
RewriteCond    %{REQUEST_URI} !^.*/$
RewriteRule    ^/mypath/(.*)$    /mypath/$1/ [R]

# every path ending on a slash forward to /examples/...
RewriteRule    ^/mypath/(.*/)$    /examples/jsp/$1

will do the trick. I think -d will not work, since /mypath/async is not existant, it only "feels" like a directory.

Aaah yes, correct. Good catch. Maybe that is why I sub-consciously inserted the word "perhaps" above.. ;-)

Incidentally, in the original Apache httpd 2.4 mod_rewrite documentation, there is a beautiful schema of how this actually works (in httpd).
Here : http://httpd.apache.org/docs/2.4/rewrite/tech.html
(in "Ruleset Processing").
Could almost have been drawn by Miro..


Felix

But I personally think that there is no need for a patch here.


the result i have is :
http://localhost:8080/mypath/async => http://localhost:8080/examples/jsp/async/ (visible rewrite)

no, it is the *redirect* which is visible, after the rewrite (to http://localhost:8080/examples/jsp/async) has taken place and Tomcat finds that this is a directory.

http://localhost:8080/mypath/async/ => http://localhost:8080/mypath/async/


no redirect, so the browser doesn't know, and believes that the response has actually come from the URL http://localhost:8080/mypath/async/.




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org




---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org

Reply via email to