Tamás Pap
Tamás Pap

Reputation: 18303

Redirect based on url arguments (via PHP or cPanel)

I just started using Amazon S3 to host static files (images, videos, etc.). For accessing the uploaded files, temporary links are created. A temporary link looks like this one:

http://zeebit.s3.amazonaws.com/stackoverflow-logo.png?AWSAccessKeyId=AKIAIXEHEYSBDWAAXVVA&Expires=1346888760&Signature=B%2BS%2FlUoRXno3UfSqf9Ua0RuCcBc%3D

What I want is to serve these file through my url, something like this:

http://s3.mydomain.com/zeebit/stackoverflow-logo.png/AKIAIXEHEYSBDWAAXVVA/B%2BS%2FlUoRXno3UfSqf9Ua0RuCcBc%3D

I know I can redirect requests to http://s3.mydomain.com to the Amazon url via PHP (for example), but I don't want the address bar to change. I can create a .htaccess to transform the url to the Amazon url, but as I know .htaccess can't redirect to external resources.

So, how can I solve this?

Upvotes: 1

Views: 729

Answers (1)

Luke Stevenson
Luke Stevenson

Reputation: 10351

There are a couple of solutions:

.htaccess Solution #1 - Rewrite Rule

RewriteEngine On
RewriteCond %{HTTP_HOST} ^s3\.  # Hostname starts with "s3."
RewriteCond %{REQUEST_URI} !-f  # Not a file
RewriteCond %{REQUEST_URI} !-d  # Not a directory
RewriteRule ^/(.+)/(.+)/(.+)/(.+)/(.+)$    http://$1.s3.amazonaws.com/$2?AWSAccessKeyId=$3&Expires=$5&Signature=$4 [R=302,L]

NOTE: Your initial desired URL was missing the "Expires" value, so the above would work for URLs formed like so:

http://s3.yourdomain.com/[[S3_Bucket_Name]]/[[S3_Filename]]/[[AWSAccessKeyId]]/[[Signature]]/[[Expires]]

So:

http://s3.mydomain.com/zeebit/stackoverflow-logo.png/AKIAIXEHEYSBDWAAXVVA/B%2BS%2FlUoRXno3UfSqf9Ua0RuCcBc%3D/1346888760

would redirect to

http://zeebit.s3.amazonaws.com/stackoverflow-logo.png?AWSAccessKeyId=AKIAIXEHEYSBDWAAXVVA&Expires=B%2BS%2FlUoRXno3UfSqf9Ua0RuCcBc%3D&Signature=1346888760

.htaccess Solution #2 - Redirect

Whilst being a less flexible solution than the above, you could put the following into your .htaccess file

redirect 302 /s3/ http://zeebit.s3.mydomain.com/

Using this rule, requests for

http://yourdomain.com/s3/stackoverflow-logo.png?AWSAccessKeyId=AKIAIXEHEYSBDWAAXVVA&Expires=B%2BS%2FlUoRXno3UfSqf9Ua0RuCcBc%3D&Signature=1346888760

Would basically retain everything after /s3/ and simply replace everything preceeding it with the Amazon S3 location.

http://zeebit.s3.amazonaws.com/stackoverflow-logo.png?AWSAccessKeyId=AKIAIXEHEYSBDWAAXVVA&Expires=B%2BS%2FlUoRXno3UfSqf9Ua0RuCcBc%3D&Signature=1346888760

Upvotes: 2

Related Questions