Internal redirect in Apache VirtualHost configuration - apache

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.

Related

Apache HTTP server redirect to port 8085 IF url contains "demo" ELSE redirect to port 8080

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>

Apache 2.4 mod_rewrite not working as expected

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}

Apache and ProxyPass proxy

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

Redirect the login page from HTTP to HTTPS via httpd.conf

I want my users who type login.abcde.com to be redirected to https://client1.abcde.com and BLOCK all other HTTP URLs. So if someone types http://client1.abcde.com/thispage/isawesome.html, it will show some error message or a 404. So far I tried to add the following to my httpd.conf, but no success. I keep getting the Apache page saying: This page is used to test the proper operation of the Apache HTTP server after it has been installed. If you can read this page, it means that the web server installed at this site is working properly, but has not yet been configured.
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^client1.abcde.com$ https://client1.abcde.com [L,R=301]
I am using Apache by the way, with WSGI. My virtualhost for port 80 is basically just:
<VirtualHost *:80>
ServerAdmin abisson#abcde.com
DocumentRoot /srv/www/abcde/html
ErrorLog "logs/error_log"
CustomLog "logs/access_log" common
</VirtualHost>
Since no one else has replied yet I will give it a try, it's untested but maybe it will give you some ideas on how to proceed. Maybe this could work:
RewriteEngine on
RewriteCond %{HTTP_HOST} ^login\.abcde\.com
RewriteCond %{REQUEST_URI} ^\/$
RewriteRule ^/(.+)$ https://client1.abcde.com/$1 [L,R]
RewriteCond %{HTTP_HOST} ^login\.abcde\.com
RewriteCond ${HTTPS} !=on
RewriteRule ^/(.+)$ [F]
Also it looks like in your case you have ^client1.abcde.com$ instead of ^login.abcde.com$ in your RewriteRule, not sure if changing it will make your solution work.
Maybe you could do the redirect in the VirtualHost as described in this RedirectSSL wiki page?

apache rewrite: force https and name of server, not IP

I want my apache to always force people to use https and to map IP based look ups to be forwarded to the server name. The following settings (in httpd.conf file) take care of the http to https redirect:
<Location />
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://my_server.example.com%{REQUEST_URI}
</Location>
But now I also want that if people type 192.168.1.2 they get redirected to my_server.example.com.
To sum up:
http://192.168.1.2/someurl -> https://my_server.example.com/someurl
I've tried several things but either my settings get ignored or I end up in a redirect loop.
any hints?
If you have access to the main config and not just .htaccess, this is something most easily done with separate virtual hosts rather than resorting to the Swiss Army chainsaw that is mod_rewrite.
<VirtualHost *:80>
Redirect permanent / https://my_server.example.com/
</VirtualHost>
<VirtualHost *:443>
Redirect permanent / https://my_server.example.com/
SSLEngine on
</VirtualHost>
<VirtualHost *:443>
ServerName my_server.example.com
SSLEngine on
...real site config...
</VirtualHost>
It's not just numeric IP address access you generally want to redirect to your canonical hostname, but all addresses other than the known-good domains you control. Putting a default virtual host first in the config, that redirects (or serves up nothing) helps avoid certain DNS-based XSS attacks.
I figured out the following solution:
<Location />
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{HTTP_HOST} !^my_server\.example\.com [NC]
RewriteRule (.*) https://my_server.example.com%{REQUEST_URI} [R=301,L]
RewriteCond %{HTTPS} off
RewriteRule (.*) https://my_server.example.com%{REQUEST_URI}
</Location>
it does exactly what I need.