I would like to implement a kind of a proxy system, where I can type url like this: http://example.com/www.stackoverflow.com and get contents of www.stackoverflow.com returned. What I tried is this:
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/external/.*
RewriteRule ^/(.*) http://%{HTTP_HOST}/external/$1 [NC,R=302,L]
ProxyPassMatch /external/([A-Za-z]*)/(.*) wwww.stackoverflow.com/$1/$2
ProxyPassMatch /external/(.*) http://$1/
This works fine, but works only for stackoverflow.com because it is hardcoded. Is there some kind of rule so that dynamic URL can work, so I can use http://example.com/yahoo.com ? And yes, if try to hardcode yahoo.com or google.com, instead of rewrite url get automatically redirected to yahoo.com or google.com, what's up with that ?
You can use the [P] flag of RewriteRule:
RewriteEngine On
RewriteRule ^/(.*) http://$1 [P]
More info here
Related
I have 2 applications running on port 8080 and 8085. Both has different URL queries/paths and application on port 8085 have keyword demo on all of its URL queries/paths and other doesn't. So it acts as an unique identifier
Can I make any change to /etc/httpd/conf/httpd.conf file so that if the server identifies demo as the keyword then request will reach application on port 8085, if not then request will reach port application on port 8080 ?
If there is a way, please provide sample configuration which goes into httpd.conf file
EDIT 1:
After trying from first 2 of below answers, I couldn't achieve this. I don't know if ProxyPass and ProxyPassReverse are not allowing to achieve this. I tried commenting them, adding them in VirtualHost etc. But did not help.
This is the flow we are expecting:
User will hit URL (without mentioning port) like - https://example.com/demo and this will be routed to app on port 8085 else routed to 8080
May be taking look at my complete httpd.conf might help
Link to my httpd.conf - https://gofile.io/d/tWIHvX
Rewrite Condition if the query string contains a word "demo":
<VirtualHost *:8080>
<Directory /var/www/example/>
Allow From All
RewriteEngine On
RewriteCond %{SERVER_PORT} !^8085$
RewriteCond %{QUERY_STRING} (demo)
RewriteRule ^Demo http://%{HTTP_HOST}:%{SERVER_PORT}/$1 [L,R]
</Directory>
</VirtualHost>
Rewrite condition if the query string does not contain the word "demo":
<VirtualHost *:8085>
<Directory /var/www/example/>
Allow From All
RewriteEngine On
RewriteCond %{SERVER_PORT} !^8080$
RewriteCond %{QUERY_STRING} (!demo)
RewriteRule ^Demo http://%{HTTP_HOST}:%{SERVER_PORT}/$1 [L,R]
</Directory>
</VirtualHost>
if the SERVER_PORT doesn't work, please try the port directly like below:
RewriteRule ^Demo http://%{HTTP_HOST}:8085/$1 [L,R]
Try:
<VirtualHost *:8080>
#some conf
RewriteCond %{REQUEST_URI} demo [OR]
RewriteCond %{QUERY_STRING} demo
RewriteRule ^ http://%{HTTP_HOST}:8085%{REQUEST_URI} [QSA,L]
#some more conf
</VirtualHost>
OR
<VirtualHost *:8085>
#some conf
RewriteCond %{REQUEST_URI} !demo
RewriteCond %{QUERY_STRING} !demo
RewriteRule ^ http://%{HTTP_HOST}:8080%{REQUEST_URI} [QSA,L]
#some more conf
</VirtualHost>
Note: self answer after being able to achieve this
Achieved this using LocationMatch directive easily. Below is the configuration.
As this is regex dependent you can change to check conditions like ends with, starts with, contains and etc. And both the below LocationMatch conditions are in my httpd.conf
1.If URL like 192.168.1.113/demo then go to 8085
<LocationMatch "^/(demo)(.*)$">
RewriteEngine on
ProxyPass http://localhost:8085/ nocanon
ProxyPassReverse http://localhost:8085/
</LocationMatch>
2.If URL not like 192.168.1.113/demo then go to 8080
<LocationMatch "^/((?!demo).)*$">
RewriteEngine on
ProxyPass http://localhost:8080/ nocanon
ProxyPassReverse http://localhost:8080/
</LocationMatch>
I'm running an app that utilizes laravel-echo-server. So for me to run it on my production server over https I need to use apache proxy reverse to redirect my /tools/socket.io/ urls to http://localhost:6001.
While that is working fine I keep getting this error Cannot Post / because I need to pass along the params from my domain url to my reverse proxy url.
Here is my apache config:
ProxyPreserveHost On
ProxyRequests off
ProxyPass /tools/socket.io/ http://localhost:6001/
ProxyPassReverse /tools/socket.io/ http://localhost:6001/
I came across this post stack overflow but the implementation didn't work for me.
So this are the parameters I need to pass and their values are dynamic EIO transport t. and my url is like
https://exampledomain.com/tools/socket.io/?EIO=3&transport=polling&t=Ml8lZDJ
Here's my apaxhe config within my SSL virtualhost for my domain:
RewriteEngine On
RewriteCond %{REQUEST_URI} ^/socket.io [NC]
RewriteCond %{QUERY_STRING} transport=websocket [NC]
RewriteRule /(.*) ws://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
I want to map multiple customer facing URLs to a single internal end-point, but with a query parameter to to identify each customer.
For example customer enters https://external_host/customer1
I want a reverse proxy to forward it as https://internal_host/app?customer=cust1
I have tried the following:
<Location "/customer1" >
RewriteEngine On
RewriteRule /customer1 /customer1?customer=cust1 [QSA,P]
ProxyPass https://<internal host>/app
ProxyPassreverse https://<internal host>/app
</Location>
<Location "/customer2" >
RewriteEngine On
RewriteRule /customer2 /customer2?customer=cust2 [QSA,P]
ProxyPass https://<internal host>/app
ProxyPassreverse https://<internal host>/app
</Location>
The basic proxy works, in that the request is forwarded to the internal server, but the query parameter is not added.
From all the reading I have done, I feel it should be possible to do what I want, but cannot get it to work.
Any pointers gratefully received.
Regards
Chris
I solved this as follows:
ProxyRequests off
ProxyPass /app http://<internal server>/app
ProxyPassReverse /app http://<internal server>/app
RewriteEngine on
RewriteRule ^/cust1.htm /app?client=cust1.htm [QSA,P]
RewriteRule ^/cust2.htm /app?client=cust2.htm [QSA,P]
Chris
The ProxyPass and ProxyPassReverse from the question config are ignored, because the P in [QSA,P] performs the proxy request.
Some additional cases to add query parameter extraparam=something to the proxied server:
Regular expression and remote server
if you need to use a regular expression in your rule (first wildcard (.*) is replaced by $1):
RewriteEngine on
RewriteRule ^/path/to/hook/to/proxy/(.*) http://example.org/$1?extraparam=something [QSA,P]
If the proxied server uses https, you should add SSLProxyEngine On to the configuration:
RewriteEngine on
SSLProxyEngine on
RewriteRule ^/path/to/hook/to/proxy/(.*) https://example.org/$1?extraparam=something [QSA,P]
I'm sure this is a simple one but I'd like to get some insight on this. I have a vm running plex media server and I'm trying to setup mod_rewrite for this. I'd like to have an HTTP connection -> SSL -> Plex
Keeping it simple, without SSL the following works
ServerName plex
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
RewriteCond %{HTTPS} !=on
ProxyPass / http://127.0.0.1:32400/
ProxyPassReverse / http://127.0.0.1:32400/
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/web
RewriteCond %{HTTP:X-Plex-Device} ^$
RewriteRule ^/$ /web/$1 [R,L]
This allows me to enter
http://plex/
Which rewrites to
http://plex/web
And removes my port number, now if I take the same as above and use https at lines 9 and 10 I break the rewrite.
Interestingly, if I use
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
RewriteCond %{HTTPS} !=on
ProxyPass / http://127.0.0.1:32400/
ProxyPassReverse / http://127.0.0.1:32400/
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/web
RewriteCond %{HTTP:X-Plex-Device} ^$
RewriteRule ^/?(.*) https://%{SERVER_NAME}:32400/web/$1 [R,L]
This works fine, but the port number is not removed. I understand this is because I'm including it in my rewrite rule.
So my question here is really two fold.
A) Why would using https instead of http at lines 9 and 10 not work as desired?
B) What is the correct setup to forward http->https while using a rewrite rule?
tyia
Try %{HTTP_HOST} instead of %{SERVER_NAME}
Accessing the Plex media server requires to access http://my-ip:32400/web which isn't very easy for non-techies to remember. I followed a blog post I found to simplify this:
<VirtualHost *:80>
ServerName mediaserver
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:32400/
ProxyPassReverse / http://127.0.0.1:32400/
RewriteEngine on
RewriteCond %{REQUEST_URI} !^/web
RewriteCond %{HTTP:X-Plex-Device} ^$
RewriteRule ^/$ /web/$1 [R,L]
</VirtualHost>
I also pointed mediaserver on my DNS server to the correct IP. This works in a way. Now I can just type http://mediaserver to access the Plex media server. However, this redirects to http://mediaserver/web. In the RewriteRule there are R and L flags. I read the documentation for the flags, removed them and added PT flag. I also checked the documentation for internal redirecting, where I found the PT flag.
So, with the rewrite rule written as RewriteRule ^/$ /web/$1 [PT], I thought it would internally redirect to /web/ and not show it in the URL. How do I fix this?
Try changing the rule to this:
RewriteRule ^/$ /web [L]
There is no group capture, so the $1 was not doing anything
The R is what causes the url to change in the browser. With just the L, you have an internal redirect, but the user doesn't see the rewritten url.