Keep Server Online
If you find the Apache Lounge, the downloads and overall help useful, please express your satisfaction with a donation.
or
A donation makes a contribution towards the costs, the time and effort that's going in this site and building.
Thank You! Steffen
Your donations will help to keep this site alive and well, and continuing building binaries. Apache Lounge is not sponsored.
| |
|
Topic: How to write RewriteRule ? |
|
Author |
|
Mox
Joined: 14 Sep 2021 Posts: 8
|
Posted: Tue 14 Sep '21 18:06 Post subject: How to write RewriteRule ? |
|
|
I need to write RewriteRule like this:
if it starts with /MyApp then /MyApp should be erased.
For example (original -> rewrited):
/MyApp/ -> /
/MyApp/Dir/file.html -> /Dir/file.html
How to do this? |
|
Back to top |
|
mraddi
Joined: 27 Jun 2016 Posts: 152 Location: Schömberg, Baden-Württemberg, Germany
|
Posted: Tue 14 Sep '21 19:27 Post subject: |
|
|
Hello Mox,
I have placed the following two lines into a .htaccess located in my document-root:
Code: | RewriteEngine On
RewriteRule ^MyApp/(.*) /$1 [L] |
In addition I have ensured that this .htaccess is processed by Apache and that the mod_rewrite-module is loaded.
Now if I access https://localhost/MyApp/phpinfo.php I get the same result as https://localhost/phpinfo.php.
If you prefer to be redirected to the new location the following modification is for you
Code: | RewriteEngine On
RewriteRule ^MyApp/(.*) /$1 [R=302,L] |
Best regards
Matthias |
|
Back to top |
|
Mox
Joined: 14 Sep 2021 Posts: 8
|
Posted: Tue 14 Sep '21 20:28 Post subject: |
|
|
Thanks for that, but it didn't solve my problem.
Let me explain what exactly I am trying to do.
I have mapped subdomain to Tomcat webapp, and configured Apache to act as a proxy server like this:
Code: |
<VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine On
ProxyPass / http://localhost:8080/MyApp/
ProxyPassReverse / http://localhost:8080/MyApp/
</VirtualHost>
|
so that I can open webapp in browser by using just subdomain URL app.mydomain.com
That works, and webapp is opening, but problem is that links on the pages are absolute, like /MyApp/images/someimage.jpg, and they have to be rewrited like this /images/someimage.jpg.
I thought by placing RewriteRule before ProxyPass would solve the issue, but it hasn't.
I tried what you suggested like this:
Code: |
<VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine On
RewriteRule ^MyApp/(.*) /$1 [L]
ProxyPass / http://localhost:8080/MyApp/
ProxyPassReverse / http://localhost:8080/MyApp/
</VirtualHost>
|
but links are not rewrited, as I checked Tomcat logs.
Can you help me solve this issue? |
|
Back to top |
|
mraddi
Joined: 27 Jun 2016 Posts: 152 Location: Schömberg, Baden-Württemberg, Germany
|
Posted: Tue 14 Sep '21 22:31 Post subject: |
|
|
Good evening,
hopefully now I have understood the problem
One idea is to add another ProxyPass for MyApp so the absolute links including the MyApp still work
Code: | <VirtualHost *:80>
ServerName app.mydomain.com
ProxyPass /MyApp/ http://localhost:8080/MyApp/
ProxyPassReverse /MyApp/ http://localhost:8080/MyApp/
ProxyPass / http://localhost:8080/MyApp/
ProxyPassReverse / http://localhost:8080/MyApp/
</VirtualHost> |
or use mod_rewrite with a redirect as in the following snippet
Code: | <VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine on
RewriteRule ^/MyApp/(.*) /$1 [R=302,L]
ProxyPass / http://localhost:8080/MyApp/
ProxyPassReverse / http://localhost:8080/MyApp/
</VirtualHost> |
to redirect the client to the URL without the MyApp
or use the PT-flag as shown here - otherwise it will result in a 404-not-found
Code: | <VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine on
RewriteRule ^/MyApp/(.*) /$1 [PT]
ProxyPass / http://localhost:8080/MyApp/
ProxyPassReverse / http://localhost:8080/MyApp/
</VirtualHost> |
|
|
Back to top |
|
tangent Moderator
Joined: 16 Aug 2020 Posts: 348 Location: UK
|
Posted: Tue 14 Sep '21 23:12 Post subject: |
|
|
@mraddi beat me to my reply, and suggests a different approach, but I'll post what I'd composed.
@Mox - your follow-up post explains more clearly what you're trying to achieve.
As you've found out, mod_rewrite manipulates requests, not responses, so the response bodies from Tomcat need editing with an output filter to edit the embedded URI's / URL's, before being passed back to the requestor.
In the past I've solved this proxy to Tomcat problem with either mod_substitute or mod_proxy_html. It rather depends on the complexity of the responses from Tomcat, but I'd say mod_proxy_html is the more flexible and robust method. Both will take a bit of setting up and testing.
I'd normally use a location block to encapsulate the proxy directives to the Tomcat server, even though in this case you've decided to proxy the entire virtual host.
A few other points to consider:
If your content from Tomcat is compressed, you'll need to disable that so the output filter can see the uncompressed responses. Alternatively, you can add a "RequestHeader unset Accept-Encoding" directive to your configuration, but you'll then find it more challenging to compress the final response back to your clients.
Next, if your Tomcat server is remote to the proxy server, you'll need to edit or remove the host part of embedded URL's to match your Apache site URL. I'd personally edit these to be site relative, even for a local tomcat server, e.g. /image.png rather than http(s)://tomcat.domain.com/image.png
If your Apache server ever ends up behind a load balancer, or the service URL differs from your Apache ServerName, then you'll probably need to edit the response headers too. Again, I'd go for site relative, e.g.
Code: | Header always edit Content-Location http(s|)://(app1.domain.com|app2.domain.com)/(.*) /$3
Header always edit Location http(s|)://(app1.domain.com|app2.domain.com)/(.*) /$3 |
Welcome to the complex world of filters! |
|
Back to top |
|
mraddi
Joined: 27 Jun 2016 Posts: 152 Location: Schömberg, Baden-Württemberg, Germany
|
Posted: Wed 15 Sep '21 6:03 Post subject: |
|
|
Good morning
@tangent: you are absolutely right - the clean way would be to modify the response instead of the request.
But it is easier and should be faster most times to modify the requests (compared to modifying the response) with the downside that the /MyApp/-path is not hidden but allowed as well.
Quote: | Welcome to the complex world of filters! |
Oh yes - I couldn't agree more! |
|
Back to top |
|
James Blond Moderator
Joined: 19 Jan 2006 Posts: 7373 Location: Germany, Next to Hamburg
|
|
Back to top |
|
Mox
Joined: 14 Sep 2021 Posts: 8
|
Posted: Wed 15 Sep '21 11:33 Post subject: |
|
|
Thanks for your suggestions.
This solution that mraddi posted works:
Code: |
<VirtualHost *:80>
ServerName app.mydomain.com
RewriteEngine on
RewriteRule ^/MyApp/(.*) /$1 [PT]
ProxyPass / http://localhost:8080/MyApp/
ProxyPassReverse / http://localhost:8080/MyApp/
</VirtualHost>
|
I will have to test more to verify that there aren't further issues, but initialy works ok. |
|
Back to top |
|
|
|
|
|
|