Apache regex config for mass redirects
am 06.04.2010 21:13:59 von Jason Nunnelley--------------020509000207040403030008
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit
The goal: to provide for three kinds of applications and application
structures (file structure driven here, so you don't have to understand
what the applications are or do to understand what I'm trying to
accomplish) in a single front end configuration.
All app servers share same front ends, so they need to share the same
Apache configuration. So, this is just like one host, one Apache
config, one IP. It's complex, but it's actually quite simple once it
resolves. The file location is universal, so the apache config would
work on a single host as well as a HAProxy fronted application server.
1st, I have some specified domains which require me to add them to the
config and then perform an apache graceful (restart). The goal here is
to get away from the requirement to do a restart by using a redirect or
reroute file for each of the potential domain names.
# Single app shared space domains based on domain1
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{SERVER_NAME} ^(.*)?\.?(domain1|domain2|domain3)\.(com|net)$
RewriteCond "/mnt/www/domain1_files/maintenance.html" -f
RewriteCond %{SCRIPT_FILENAME} !"/mnt/www/domain1/maintenance.html"
RewriteCond %{SCRIPT_FILENAME} !^(.+).(gif|png|jpg|css|js|swf)$
RewriteRule ^.*$ "/mnt/www/domain1/maintenance.html" [L]
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond %{SERVER_NAME} ^(.*)?\.?(domain1|domain2|domain3)\.(com|net)$
RewriteRule ^/(.*)$/mnt/www/domain1/public_html/$1 [L]
So, notice that I'm testing for a particular set of domains, then
pushing any domain that matches the list to a file location. In this
case they all share domain1's file source, since it handles all the
sites that are of like kind. Our application parses the domain based on
how Apache receives the request - so domain2.com is handled by
domain1.com's file system and app but the database spits back its
discrete content.
All these domains are managed by the same software, so they use the same
file system location. Instead of pushing them to discrete file system
locations like those below (which go to file/named/after/domain/public_html)
Here's how I serve my directory based websites:
# Production Discrete Sites
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond /mnt/www/production/www.%{SERVER_NAME} -d
RewriteRule ^/(.*)$http://www.%{SERVER_NAME}/$1 [L]
RewriteCond %{REQUEST_URI} !^/icons/
RewriteRule ^/(.*)$
/mnt/www/production/${lowercase:%{SERVER_NAME}}/public_html/ $1 [L]
I have two or three of the situations above, where application servers
run different apps. What I'm trying to figure out is how to redirect
them based on a redirect file as they come in as an apache server request.
Here's an example of a rewrite rule that works for redirecting to an
URL. What I need to do is redirect to a file location to serve the
website's application/files.
# Setup redirect map
RewriteMap redirects txt:/mnt/www/.redirect_map
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond ${redirects:%{SERVER_NAME}|notfound} !^notfound$
RewriteCond %{REQUEST_URI} !^/$
RewriteRule ^(/.*)$http://${redirects:%{SERVER_NAME}}$1 [L]
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond ${redirects:%{SERVER_NAME}|notfound} !^notfound$
RewriteRule ^/$http://${redirects:%{SERVER_NAME}} [L]
What's I'm trying to do is combine the best of three processes. I'd like
to add a redirect/cond to send URL requests to an app or file location
based on the redirect map.
So, instead of a redirect map that looks likes this:
domain1 domain1.com
domain2 domain2.com/domain2content
I'd like to do something more like this:
domain1 /mnt/www/domain1.com
domain2 /mnt/www/domain1.com
domain3 /mnt/www/domain3.com
And so forth.
The goal here is to automate things and cut down on apache restarts.
Also, I intend to leave the redirect rule that sends all remaining
www.domain requests to thewww.$DOMAIN file location for that website's
discrete application files.
Opinions, ideas, etc. are solicited.
--
Jason A. Nunnelley
http://www.google.com/profiles/imjasonn
--------------020509000207040403030008
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
The goal: to provide for three kinds of applications and application
structures (file structure driven here, so you don't have to understand
what the applications are or do to understand what I'm trying to
accomplish) in a single front end configuration.
All app servers share same front ends, so they need to share the same
Apache configuration. So, this is just like one host, one Apache
config, one IP. It's complex, but it's actually quite simple once it
resolves. The file location is universal, so the apache config would
work on a single host as well as a HAProxy fronted application server.
1st, I have some specified domains which require me to add them to the
config and then perform an apache graceful (restart). The goal here is
to get away from the requirement to do a restart by using a redirect or
reroute file for each of the potential domain names.
# Single app shared space domains based on domain1
RewriteCond %{REQUEST_URI} !^ class="moz-txt-tag">/icons/
RewriteCond %{SERVER_NAME} ^(.*)?\.?(domain1|domain2|domain3)\.(com|net)$
RewriteCond "/mnt/www/domain1_files/maintenance.html" -f
RewriteCond %{SCRIPT_FILENAME} !"/mnt/www/domain1/maintenance.html"
RewriteCond %{SCRIPT_FILENAME} !^(.+).(gif|png|jpg|css|js|swf)$
RewriteRule ^.*$ "/mnt/www/domain1/maintenance.html" [L]
RewriteCond %{REQUEST_URI} !^ class="moz-txt-tag">/icons/
RewriteCond %{SERVER_NAME} ^(.*)?\.?(domain1|domain2|domain3)\.(com|net)$
RewriteRule ^/(.*)$ /mnt/www/domain1/public_html class="moz-txt-tag">/$1 [L]
So, notice that I'm testing for a particular set of domains, then
pushing any domain that matches the list to a file location. In this
case they all share domain1's file source, since it handles all the
sites that are of like kind. Our application parses the domain based on
how Apache receives the request - so domain2.com is handled by
domain1.com's file system and app but the database spits back its
discrete content.
All these domains are managed by the same software, so they use the same
file system location. Instead of pushing them to discrete file system
locations like those below (which go to file/named/after/domain/public_html)
Here's how I serve my directory based websites:
# Production Discrete Sites
RewriteCond %{REQUEST_URI} !^ class="moz-txt-tag">/icons/
RewriteCond /mnt/www/production/www.%{SERVER_NAME} -d
RewriteRule ^/(.*)$ {SERVER_NAME}/$1 [L]
RewriteCond %{REQUEST_URI} !^ class="moz-txt-tag">/icons/
RewriteRule ^/(.*)$
/mnt/www/production class="moz-txt-tag">/${lowercase:%{SERVER_NAME}} class="moz-txt-slash">/public_html class="moz-txt-tag">/$1 [L]
I have two or three of the situations above, where application servers
run different apps. What I'm trying to figure out is how to redirect
them based on a redirect file as they come in as an apache server request.
Here's an example of a rewrite rule that works for redirecting to an
URL. What I need to do is redirect to a file location to serve the
website's application/files.
# Setup redirect map
RewriteMap redirects txt: class="moz-txt-tag">/mnt/www/.redirect_map
RewriteMap lowercase int:tolower
RewriteCond %{REQUEST_URI} !^ class="moz-txt-tag">/icons/
RewriteCond ${redirects:%{SERVER_NAME}|notfound} !^notfound$
RewriteCond %{REQUEST_URI} !^/$
RewriteRule ^(/.*)$ {redirects:%{SERVER_NAME}}$1 [L]
RewriteCond %{REQUEST_URI} !^ class="moz-txt-tag">/icons/
RewriteCond ${redirects:%{SERVER_NAME}|notfound} !^notfound$
RewriteRule ^/$ {redirects:%{SERVER_NAME}} [L]
What's I'm trying to do is combine the best of three processes. I'd like
to add a redirect/cond to send URL requests to an app or file location
based on the redirect map.
So, instead of a redirect map that looks likes this:
domain1 domain1.com
domain2 domain2.com/domain2content
I'd like to do something more like this:
domain1 /mnt/www/domain1.com
domain2 /mnt/www/domain1.com
domain3 /mnt/www/domain3.com
And so forth.
The goal here is to automate things and cut down on apache restarts.
Also, I intend to leave the redirect rule that sends all remaining
requests to the class="moz-txt-link-abbreviated" href="http://www.$DOMAIN">www.$DOMAIN file location for that website's
discrete application files.
Opinions, ideas, etc. are solicited.
--
Jason A. Nunnelley
--------------020509000207040403030008--