Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Apache Rewrite: image directory based on HTTP host

My software supports multiple domain names all pointed at the same directory on the server (a different database for each of course). So these domains...

www.example1.com
www.example2.com
www.example3.com

...all point to...

/public_html/

In the image directory...

/public_html/images/

I have directories that exactly match the host names for each website:

/public_html/images/www.example1.com/
/public_html/images/www.example2.com/
/public_html/images/www.example3.com/

I'm trying to get Apache to rewrite requests so that if you view the image directly and look at the address bar you only see the host name once.

So a request for...

http://www.example1.com/images/book.png

...is fetched by Apache at...

/public_html/images/www.example1.com/book.png

One of the things I've tried and have had success with in different circumstances is the following though it doesn't work in this situation:

RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1
like image 518
John Avatar asked Oct 09 '22 19:10

John


2 Answers

Try adding the following to the .htaccess file in the root directory of your site (public_html)

RewriteEngine on
RewriteBase / 

#prevent looping from internal redirects
RewriteCond %{ENV:REDIRECT_STATUS} !200
#only rewrite gif, jpg or png
RewriteRule ^(images)(/.+\.(gif|jpg|png))$ $1/%{HTTP_HOST}$2 [L,NC] 

Your rule

RewriteRule ^[^/]*/images(.+) images/%{HTTP_HOST}/$1

did not work because you have a leading / before images. In .htaccess the leading / is removed, so the rule would never match.

like image 105
Ulrich Palha Avatar answered Oct 12 '22 12:10

Ulrich Palha


Here's one of the things I've made for my high performance framework (see my bio).

I give you an advanced RewriteRule, I'm pretty sure you'll have enough material to finish:

Create static domains:

static.example1.com
static.example2.com
static.example3.com

Where all your images will be.

From now on, no more:

www.example1.com/images/www.example1.com/picture.jpg
www.example2.com/images/www.example2.com/picture.jpg
www.example3.com/images/www.example3.com/picture.jpg

but

static.example1.com/picture.jpg
static.example2.com/picture.jpg
static.example3.com/picture.jpg

Nice URLs uh? Now create a vhost with all your static files:

<VirtualHost *>
    ServerName static.example1.com
    ServerAlias static.example2.com static.example3.com
</VirtualHost>

Set your document root to the base without the vhost name, so in your case:

DocumentRoot "/public_html/images"

And add this RewriteRule

RewriteCond %{HTTP_HOST} ^static\.([a-zA-Z0-9\-]+)\.com$
# Change the path, and add the request:
RewriteRule  (.*) %{DOCUMENT_ROOT}/static.%1.com$1 [QSA,L]

So all in all:

<VirtualHost *>
    ServerName static.example1.com
    ServerAlias static.example2.com static.example3.com
    RewriteCond %{HTTP_HOST} ^static\.([a-zA-Z0-9\-]+)\.com$
    # Change the path, and add the request:
    RewriteRule  (.*) %{DOCUMENT_ROOT}/static.%1.com$1 [QSA,L]
</VirtualHost>

Ok that doesn't aswer exactly to your question so here's the short answer, but I don't like it because it doesn't help you to do a very (very) good job:

    RewriteCond %{HTTP_HOST} ^www\.(example1|example2|example3)\.com$
    # Change the path:
    RewriteRule (.*)(\.(css|js|txt|htc|pdf|jpg|jpeg|gif|png|ico))$ %{DOCUMENT_ROOT}/www.%1.com$1$2 [QSA,L]

And if that's not enough:

Two hints:

If you're not in a hosted environment (= if it's your own server and you can modify the virtual hosts, not only the .htaccess files), try to use the RewriteLog directive: it helps you to track down such problems:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

My favorite tool to check for regexp:

http://www.quanetic.com/Regex (don't forget to choose ereg(POSIX) instead of preg(PCRE)!)

like image 43
Olivier Pons Avatar answered Oct 12 '22 12:10

Olivier Pons