HTTP Redirects
Why send HTTP redirects?
It is frequently desirable to direct Web clients requesting one URL to another. For example, if you maintain a Web site for a course that is offered regularly, you probably want to have new content for each term that the course is offered. But you listened to Tim B-L and know that cool URIs don’t change, so you created subdirectories for each term. Now when students go to the top level of the course Web site, they get a directory listing of all the previous terms. You want them to go directly to the current term’s pages.
The answer is to issue a redirect. More specifically, you want to issue a temporary redirect, which tells the browser “the content for the thing you requested is now over here”, as opposed to a permanent redirect (“the thing you want has moved and here is the new name”). Doing this correctly is quite simple on the CSAIL Web servers. Unfortunately, doing it incorrectly is even easier. It will be better for the Internet as a whole if as many people as possible do it the right way.
Most people’s first try at this is to create an index.html
file in
their top-level directory. That hides the extraneous content, but
doesn’t actually redirect the user (because there is no way to issue a
redirect from plain HTML). It is possible to issue a redirect from PHP
or from a CGI script, if you’re already using dynamic content, but
that’s a big hammer to use on this problem. So many users (helped by a
lot of resources on the Web which say to do it this way) hit on the idea
of having a “refresh” in their index.html
file, which instructs the
browser to go to a different URL. This is usually set up to refresh
immediately, which looks like a redirect to the user (until they try
to use their browser’s “back” button) but actually means something
completely different.
How to send HTTP redirects from a CSAIL Web site
We have found that the simplest method is as follows. In the most common
case, you want to redirect from some directory (let’s say it’s
/6.xxx/
) to a subdirectory of that same directory, but without
breaking URLs that refer to other subdirectories. Create an .htaccess
file in the top-level directory (usually .../www/data/
), or add to an
existing .htaccess
file, the following:
RewriteEngine on
RewriteBase /6.xxx/
RewriteRule ^$ fall09/ [R=temp]
In place of the directory fall09/
in the RewriteRule
command above,
you can also supply a complete URL (which you might do, for example, if
you have decided to move your course to Stellar). You can also change
the temp
to permanent
if you will no longer be using or publishing
the CSAIL URL. In the unusual case where your content lives at the “top
level” of the Web server, you must omit the RewriteBase
directive.
Redirecting specific paths
What if you want multiple URIs to go to the same place? For example, at
first you create a webpage /6.xxx/notes.html
, but later you realize
you really wanted a directory /6.xxx/notes/
, but you don’t want to
break old links. In this case, you can use the simpler Redirect
mechanism in your .htaccess
file:
RedirectPermanent /6.xxx/notes.html /6.xxx/notes/
You can omit the Permanent
if you think this might change in the
future.
Another example: you want /6.xxx/fall09 to redirect to /6.yyy/fall09, because back in 2009 the now-permanent class number 6.xxx was known as temporary class number 6.yyy. Then you can use
RedirectPermanent /6.xxx/fall09 /6.yyy/fall09