mod_rewrite
TRANSCRIPT
![Page 1: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/1.jpg)
/
mod_rewrite
Introduction to mod_rewriteRich Bowen, Web Engineer, OmniTI
http://people.apache.org/~rbowen/
http://httpd.apache.org/docs/trunk/rewrite
Thursday, November 5, 2009
![Page 2: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/2.jpg)
Outline
• Regex basics
• RewriteRule
• RewriteCond
• RewriteMap
• The evils of .htaccess files
• Recipes
Thursday, November 5, 2009
![Page 3: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/3.jpg)
mod_rewrite is not magic
• Fear, more than complexity, makes mod_rewrite difficult
Thursday, November 5, 2009
![Page 4: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/4.jpg)
Although, it is complex
``The great thing about mod_rewrite
is it gives you all the configurability and flexibility of Sendmail. The downside to
mod_rewrite is that it gives you all the configurability and flexibility of
Sendmail.'' -- Brian Behlendorf
Thursday, November 5, 2009
![Page 5: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/5.jpg)
And let’s not forget voodoo!
`` Despite the tons of examples and docs,
mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. '' -- Brian Moore
Thursday, November 5, 2009
![Page 6: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/6.jpg)
Line noise
Regular expressions are
just line noise.
I hate them!
And if you see some of the examples that show up on IRC, you’d think that too ...
Thursday, November 5, 2009
![Page 7: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/7.jpg)
Now that that’s out of the way
• Regular expressions are not magic
• They are an algebraic expression of text
patterns
• Once you get over the mysticism, it can
still be hard, but it's no longer mysterious
Thursday, November 5, 2009
![Page 8: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/8.jpg)
Vocabulary
• We’re going to start with a very small vocabulary, and work up from there
• Most of the time, this vocabulary is all that you’ll need
Thursday, November 5, 2009
![Page 9: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/9.jpg)
.
• . matches any character
• “a.b” matches acb, axb, a@b, and so on
• It also matches Decalb and Marbelized
Thursday, November 5, 2009
![Page 10: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/10.jpg)
Repetition
• + means that something needs to appear one or more times: ‘a+’ matches ‘a’, ‘aa’, ‘aaa’, and ‘Mondrian’
• * matches zero or more. ‘a*’ matches ‘a’, ‘aa’, and the empty string (‘’)
• ? means that the match is optional. ‘colou?r’ matches ‘color’ and ‘colour’
Thursday, November 5, 2009
![Page 11: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/11.jpg)
Anchors
• ^ means “starts with”. ‘^a’ matches ‘alpha’ and ‘arnold’
• $ means “ends with”. ‘a$’ matches ‘alpha’ and ‘stella’
• ‘^$’ matches an empty string
• ‘^’ matches every string (every string has a start)
Thursday, November 5, 2009
![Page 12: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/12.jpg)
( ) - Grouping
• ( ) allows you to group several characters into one thingy, and apply other modifiers to it.
• “(ab)+” matches ababababababab
Thursday, November 5, 2009
![Page 13: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/13.jpg)
( ) - Backreferences
• ( ) allows you to capture a match so that you can use it later (called a backreference)
• It might be called $1 or %1 depending on the context
• The second match is called $2 (or %2) and so on
Thursday, November 5, 2009
![Page 14: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/14.jpg)
[ ]
• [ ] defines a “character class”
• [abc] matches a or or b or c
• “c[uoa]t” matches cut, cot, or cat
• It also matches cote
• It does not match coat
Thursday, November 5, 2009
![Page 15: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/15.jpg)
NOT
• In mod_rewrite regular expressions, ! negates any match
• In a character class, ^ negates the character class
• [^ab] matches any character except for a or b.
Thursday, November 5, 2009
![Page 16: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/16.jpg)
So, what does this have to do with Apache?
• mod_rewrite lets you match URLs (or other things) and transform the target of the URL based on that match.
RewriteEngine On RewriteRule (.*)\.cfm$ $1.php [PT]
Thursday, November 5, 2009
![Page 17: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/17.jpg)
RewriteEngine
• “RewriteEngine On” enables the mod_rewrite rewriting engine
• No rewrite rules will be performed unless this is enabled in the active scope
Thursday, November 5, 2009
![Page 18: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/18.jpg)
RewriteLog
RewriteLog /www/logs/rewrite_logRewriteLogLevel 9
You should turn on the RewriteLog before you do any troubleshooting.
Thursday, November 5, 2009
![Page 19: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/19.jpg)
RewriteRule pattern target [flags]
• The pattern part is the regular expression that you want to look for in the URL
• If they try to go HERE send them HERE instead.
• The behavior can be further modified by the use of one or more flags
RewriteRule
Thursday, November 5, 2009
![Page 20: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/20.jpg)
URL beautification
• A URL looks like:
http://example.com/cgi-bin/book.cgi?author=bowen&topic=apache
We would prefer that it looked like
http://example.com/book/bowen/apache
It’s easier to type, and easier to remember
Thursday, November 5, 2009
![Page 21: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/21.jpg)
Example 1, cont’d
• User does not notice that the transformation has been made
• Used $1 and $2 to capture what was requested
• Slight oversimplification. Should probably use ([^/]+) instead.
RewriteRule ^/book/(.*)/(.*) \ /cgi-bin/book.cgi?topic=$1&author=$2 [PT]
Thursday, November 5, 2009
![Page 22: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/22.jpg)
Example 1, cont’d
• Should probably use ([^/]+) instead of (.*)
• (.*) is frequently used when something else would be faster, or at least more correct.
RewriteRule ^/book/([^/]+)/([^/]+) \ /cgi-bin/book.cgi?topic=$1&author=$2 [PT]
Thursday, November 5, 2009
![Page 23: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/23.jpg)
Flags
• Flags can modify the behavior of a RewriteRule
• I used a flag in the example, and didn’t tell you what it meant
Thursday, November 5, 2009
![Page 24: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/24.jpg)
Default
• Default is to treat the rewrite target as a file path
• If the target starts in http:// or https:// then it is treated as a URL, and a [R] is assumed (Redirect)
• In a .htaccess file, or in <Directory> scope, the file path is assumed to be relative to that scope
Thursday, November 5, 2009
![Page 25: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/25.jpg)
RewriteRule flags
• [Flag] appears at end of RewriteRule
• More than one flag separated by commas - eg [R,L,NE] (no spaces)
• There’s *lots* of flags
Thursday, November 5, 2009
![Page 26: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/26.jpg)
Escape Backreferences
• [B] (There’s no long version)
• Causes backreferences to be escaped to preserve special characters
• The former will collapse escaped characters (convert %2b to + for example) while the latter will preserve them (stay as %2b)
RewriteRule ^(.*)$ index.php?show=$1RewriteRule ^(.*)$ index.php?show=$1 [B]
Thursday, November 5, 2009
![Page 27: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/27.jpg)
Cookie
• [CO=NAME:Value:Domain[:lifetime[:path]]
• Long form [cookie=...]
• Sets a cookie
RewriteRule ^/index.html - [CO=frontdoor:yes:.example.com]
In this case, the default values for path (”/”) and lifetime (”session”) are assumed.
Thursday, November 5, 2009
![Page 28: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/28.jpg)
Discard Path Info
• [DPI] or [discardpathinfo]
• Discards additional PathInfo bits that may have accumulated via rewriting
Thursday, November 5, 2009
![Page 29: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/29.jpg)
Env
• [E=var:val]
• Long form [env=...]
• Sets environment variable
• Note that most of the time, SetEnvIf works just fine
RewriteRule \.(gif|jpg|png)$ - [env=image:1]CustomLog /var/log/access_log \ combined env=!image
Thursday, November 5, 2009
![Page 30: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/30.jpg)
Forbidden
• [F] or [Forbidden] forces a 403 Forbidden response
• Consider mod_security instead for pattern-based URL blocking
RewriteEngine OnRewriteRule (cmd|root)\.exe - [F]
You could use this in conjunction with [E] to avoid logging that stuff
RewriteRule (cmd|root)\.exe - [F,E=dontlog:1]
CustomLog /var/log/apache/access_log combined \
env=!dontlog
Thursday, November 5, 2009
![Page 31: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/31.jpg)
Handler
• [H=application/x-httpd-php]
• Forces the use of a particular handler to handle the resulting URL
RewriteEngine OnRewriteRule !\. - \ [H=application/x-httpd-php]
Thursday, November 5, 2009
![Page 32: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/32.jpg)
Last
• [L] indicates that you’ve reached the end of the current ruleset
• Any rules following this will be considered as a completely new ruleset
• It’s a good idea to use it, even when it would otherwise be default behavior. It helps make rulesets more readable.
Thursday, November 5, 2009
![Page 33: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/33.jpg)
[L] in .htaccess files
• [L] means to hand the resulting URI back to the URI-mapping process.
• Part of this process may result in the .htaccess file being invoked again.
• Thus, in .htaccess files, [L] can initiate loops.
• Use RewriteCond to avoid loops (see examples later)
Thursday, November 5, 2009
![Page 34: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/34.jpg)
Proxy
• [P] rules are served through a proxy subrequest
• mod_proxy must be installed for this flag to work
RewriteEngine OnRewriteRule (.*)\.(jpg|gif|png) \ http://images.example.com$1.$2 [P]
Thursday, November 5, 2009
![Page 35: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/35.jpg)
Passthrough
• [PT] or [passthrough]
• Hands it back to the URL mapping phase
• Treat this as though this was the original request
Thursday, November 5, 2009
![Page 36: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/36.jpg)
QSAppend
• [QSA] or [qsappend] appends to the query string, rather than replacing it.
Thursday, November 5, 2009
![Page 37: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/37.jpg)
Redirect
• [R] or [redirect] forces a 302 Redirect
• Note that in this case, the user will see the new URL in their browser
• This is the default behavior when the target starts with http:// or https://
Thursday, November 5, 2009
![Page 38: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/38.jpg)
Redirect
• Can designate a different redirect status code with [R=305]
• Can even do [R=404] if you want.
Thursday, November 5, 2009
![Page 39: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/39.jpg)
Skip
• [S=n] or [skip=n] skips the next n RewriteRules
• Can be used for negation of a block of rules - as a sort of inverse RewriteCond
# Don’t run these rules if its an imageRewriteRule ^/images - [S=4]
Thursday, November 5, 2009
![Page 40: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/40.jpg)
RewriteCond and [S]
• Problem: I want this RewriteCond to apply to all of the next 4 rules:
# Block OneRewriteCond %{HTTP_HOST} example.comRewriteRule \.gif$ /something1.htmlRewriteRule \.jpg$ /something2.htmlRewriteRule \.ico$ /something3.htmlRewriteRule \.png$ /something4.html
# Block TwoRewriteRule ^ - http://something.else.com/ [R]
Thursday, November 5, 2009
![Page 41: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/41.jpg)
RewriteCond and [S]
• DOESN’T WORK
# Block OneRewriteCond %{HTTP_HOST} example.comRewriteRule \.gif$ /something1.htmlRewriteRule \.jpg$ /something2.htmlRewriteRule \.ico$ /something3.htmlRewriteRule \.png$ /something4.html
# Block TwoRewriteRule ^ - http://something.else.com/ [R]
Thursday, November 5, 2009
![Page 42: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/42.jpg)
RewriteCond and [S]
• Solution: Use an [S] flag as a GoTo statement
# Block OneRewriteCond !%{HTTP_HOST} example.comRewriteRule ^ - [S=4]RewriteRule \.gif$ /something1.htmlRewriteRule \.jpg$ /something2.htmlRewriteRule \.ico$ /something3.htmlRewriteRule \.png$ /something4.html
# Block TwoRewriteRule ^ - http://something.else.com/ [R]
Thursday, November 5, 2009
![Page 43: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/43.jpg)
Type
• [T=text/html]
• Forces the Mime type on the resulting URL
• Good to ensure that file-path redirects are handled correctly
RewriteRule ^(.+\.php)s$ $1 [T=application/x-httpd-php-source]
Thursday, November 5, 2009
![Page 44: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/44.jpg)
Others
• [NC] or [nocase] makes the RewriteRule case insensitive
• [NE] or [NoEscape] - Don’t URL-escape the results
• [NS] - Don’t run on subrequests
Thursday, November 5, 2009
![Page 45: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/45.jpg)
Infrequently used
• [C] or [Chain] - Rules are considered as a whole. If one fails, the entire chain is abandoned
• [N] or [Next] - Start over at the top. Useful for rules that run in a while loop
RewriteRule (.+)-(.+) $1_$2 [N]
Thursday, November 5, 2009
![Page 46: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/46.jpg)
RewriteCond
• Causes a rewrite to be conditional
• Can check the value of any variable and make the rewrite conditional on that.
RewriteCond TestString Pattern [Flags]
Thursday, November 5, 2009
![Page 47: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/47.jpg)
RewriteCond
• Test string can be Env vars, headers, or a literal expression
• Backreferences become %1, %2, etc
Thursday, November 5, 2009
![Page 48: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/48.jpg)
Example - Looping
• Looping occurs when the target of a rewrite rule matches the pattern
• This results in an infinite loop of rewrites
RewriteRule ^/example /example.html [PT]
Thursday, November 5, 2009
![Page 49: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/49.jpg)
Example - Looping
• Looping occurs when the target of a rewrite rule matches the pattern
• This results in an infinite loop of rewrites
RewriteRule ^/example /example.html [PT]
Thursday, November 5, 2009
![Page 50: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/50.jpg)
Example - Looping
• Solution: use RewriteCond to exclude that condition.
RewriteCond %{REQUEST_URI} \ !^/example.htmlRewriteRule ^/example /example.html [PT]
Thursday, November 5, 2009
![Page 51: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/51.jpg)
Conditional rewrites
• Rewrites conditional on some arbitrary thingy
• Only first Rule is dependent
RewriteEngine onRewriteCond %{TIME_HOUR}%{TIME_MIN} >0700RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900RewriteRule ^page\.html$ page.day.htmlRewriteRule ^page\.html$ page.night.html
Thursday, November 5, 2009
![Page 52: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/52.jpg)
Conditional rewrites
• At 08:30 ...
RewriteEngine onRewriteCond %{TIME_HOUR}%{TIME_MIN} >0700RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900RewriteRule ^page\.html$ page.day.htmlRewriteRule ^page\.html$ page.night.html
Thursday, November 5, 2009
![Page 53: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/53.jpg)
Conditional rewrites
• Could also use an [L] flag here
RewriteEngine onRewriteCond %{TIME_HOUR}%{TIME_MIN} >0700RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900RewriteRule ^page\.html$ page.day.html [L]RewriteRule ^page\.html$ page.night.html
Thursday, November 5, 2009
![Page 54: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/54.jpg)
Conditional rewrites
• At 21:49 ...
RewriteEngine onRewriteCond %{TIME_HOUR}%{TIME_MIN} >0700RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900RewriteRule ^page\.html$ page.day.htmlRewriteRule ^page\.html$ page.night.html
Thursday, November 5, 2009
![Page 55: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/55.jpg)
SSL Rewrites
• Redirect requests to https:// if the request was for http
RewriteCond %{HTTPS} !onRewriteRule (.*) https://%{HTTP_HOST}/$1 [R]
Thursday, November 5, 2009
![Page 56: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/56.jpg)
Force a hostname
RewriteCond %{HTTP_HOST} !www.example.comRewriteRule (.*) http://www.example.com/$1 [R=301]
Thursday, November 5, 2009
![Page 57: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/57.jpg)
Force a hostname
RewriteCond %{HTTP_HOST} !www.example.comRewriteRule (.*) http://www.example.com/$1 [R=301]
Thursday, November 5, 2009
![Page 58: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/58.jpg)
RewriteMap
• Call an external program, or map file, to perform the rewrite
• Useful for very complex rewrites, or perhaps ones that rely on something outside of Apache
Thursday, November 5, 2009
![Page 59: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/59.jpg)
RewriteMap - file
• File of one-to-one relationships
RewriteMap dogmap txt:/www/conf/dogmap.txtRewriteRule ^/dog/(.*) ${dogmap:$1} [NE,PT]
Where dogmap.txt contains:
doberman /dogs.php?breed=278poodle /dogs.php?breed=78collie /dogs.php?breed=98terrier /dogs.php?breed=148mutt /dogs.php?breed=2alsatian /dogs.php?breed=113
Requests for http://example.com/dog/something now get redirected to the page for that breed. [NE] ensures that the ? doesn’t get escaped.
Thursday, November 5, 2009
![Page 60: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/60.jpg)
dbm
• Convert a one-to-one text mapping to a dbm file
• httxt2dbm utility does this conversion
RewriteMap dogmap \ dbm:/www/conf/dogs.map
Thursday, November 5, 2009
![Page 61: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/61.jpg)
RewriteMap - program
• Call an external program to do the rewrite
• Perl is a common choice here, due to its skill at handling text.
RewriteMap dash2score \ prg:/usr/local/apache/conf/dash2score.plRewriteEngine OnRewriteRule (.*-.*) ${dash2score:$1} [PT]
Thursday, November 5, 2009
![Page 62: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/62.jpg)
dash2score.pl
#!/usr/bin/perl $| = 1; # Turn off buffering while (<STDIN>) { s/-/_/g; # Replace - with _ globally print $_; }
* Turn off buffering* Script runs for lifetime of Apache process* Blocking - use RewriteLock
Thursday, November 5, 2009
![Page 63: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/63.jpg)
SQL (in 2.3-HEAD)
• Have a SQL statement in the RewriteMap directive which returns the mapping
• ‘fastdbd’ caches, ‘dbd’ doesn’t
RewriteMap myquery "fastdbd:SELECT destination FROM rewrite WHERE source = %s"
Thursday, November 5, 2009
![Page 64: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/64.jpg)
.htaccess files
• .htaccess files introduce many additional complexities
• However, a lot of people have no choice
• So ...
Thursday, November 5, 2009
![Page 65: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/65.jpg)
.htaccess files
• In .htaccess files, or <Directory> scope, everything is assumed to be relative to that current scope
• So, that scope is removed from the RewriteRule
• ^/index.html in httpd.conf becomes ^index.html in a .htaccess file or <Directory> scope
Thursday, November 5, 2009
![Page 66: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/66.jpg)
.htaccess files
# In httpd.confRewriteRule ^/images/(.+)\.jpg /images/$1.png
# In .htaccess in root dirRewriteBase /RewriteRule ^images/(.+)\.jpg images/$1.png
# In .htaccess in images/RewriteBase /images/RewriteRule ^(.+)\.jpg $1.png
Thursday, November 5, 2009
![Page 67: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/67.jpg)
.htaccess files
• RewriteLog is particularly useful when trying to get .htaccess file RewriteRules working.
• However, you can’t turn on RewriteLog in a .htaccess file, and presumably you’re using .htaccess files because you don’t have access to the main server config.
• It’s a good idea to set up a test server and test there with RewriteLog enabled
Thursday, November 5, 2009
![Page 68: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/68.jpg)
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_URI} !handler.phpRewriteRule (.*) /handler.php?$1 [PT,L,NE,QSA]
All requests are sent to handler.phpThe request is passed as a QUERY_STRING
argument to handler.php so that it knows what was requested.
Redirect to one thing
Thursday, November 5, 2009
![Page 69: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/69.jpg)
RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_URI} !handler.phpRewriteRule (.*) /handler.php?$1 [PT,L,NE,QSA]
In 2.4, this is replaced with a single directive, FallbackResource:
FallbackResource
FallbackResource /handler.php
Thursday, November 5, 2009
![Page 70: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/70.jpg)
Query String
• RewriteRule doesn’t have access to the Query String
# Rewrite based on query stringRewriteCond %{QUERY_STRING} \ \bfoo=(.*?)\bRewriteRule /something /somewhere/%1 [QSA]
Thursday, November 5, 2009
![Page 71: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/71.jpg)
Query String
• “word” boundaries
# Rewrite based on query stringRewriteCond %{QUERY_STRING} \ \bfoo=(.*?)\bRewriteRule /something /somewhere/%1 [QSA]
Thursday, November 5, 2009
![Page 72: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/72.jpg)
Virtual Hosts
• Rewrite a request to a directory based on the requested hostname.
Thursday, November 5, 2009
![Page 73: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/73.jpg)
• The hostname ends up in %1
• The requested path is in $1 - includes leading slash
• Will probably have to do special things for handlers (like .php files)
RewriteEngine OnRewriteCond %{HTTP_HOST} (.*)\.example\.com [NC]RewriteRule (.*) /home/%1/www$1
Thursday, November 5, 2009
![Page 74: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/74.jpg)
Dav upload php
• Upload php, then execute it. Bad.
RewiteEngine OnRewriteCond %{REQUEST_METHOD} =PUT [OR]RewriteCond %{REQUEST_METHOD} =MOVERewriteRule ^/dav/(.*)\.php /dav/$1.nophp
Thursday, November 5, 2009
![Page 75: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/75.jpg)
PHP when no file ext
• Force files with no file extension to be handled by php
Thursday, November 5, 2009
![Page 76: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/76.jpg)
• Allows you to have URLs without the annoying “.php” on the end.
RewriteEngine OnRewriteRule !\. - [H=application/x-httpd-php]
Thursday, November 5, 2009
![Page 77: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/77.jpg)
• Doesn’t contain a dot
RewriteEngine OnRewriteRule !\. - [H=application/x-httpd-php]
Thursday, November 5, 2009
![Page 78: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/78.jpg)
• Don’t rewrite it
RewriteEngine OnRewriteRule !\. - [H=application/x-httpd-php]
Thursday, November 5, 2009
![Page 79: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/79.jpg)
• Force it to use the php handler
RewriteEngine OnRewriteRule !\. - [H=application/x-httpd-php]
Thursday, November 5, 2009
![Page 80: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/80.jpg)
Use PATH_INFO
• Now you can have URLs like
• Use $_SERVER[PATH_INFO] to grab the additional bits of the request
http://example.com/handler/arg1/arg2
Thursday, November 5, 2009
![Page 81: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/81.jpg)
mod_negotiation
• Might be able to do the same thing with mod_negotiation
• Options +MultiViews
Thursday, November 5, 2009
![Page 82: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/82.jpg)
<If>
• Just added
• Makes much of mod_rewrite unnecessary.
• http://httpd.apache.org/docs/trunk/mod/core.html#if
<If "$req{Host} = ‘myhost.com’">
Thursday, November 5, 2009
![Page 83: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/83.jpg)
<If>
• Variable can be in $req, $resp, or $env
• Any Request, Response, or Environment variable
<If "$env{foo} = ‘bar’"> ...</If>
Thursday, November 5, 2009
![Page 84: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/84.jpg)
Related modules
• mod_substitute
• mod_ext_filter
• mod_proxy_html
• mod_line_edit
Thursday, November 5, 2009
![Page 85: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/85.jpg)
How do I do that ...
• Questions like “How do I do XYZ with mod_rewrite” often have the same answer
• YOU DON’T
• These modules are sometimes the right answer
Thursday, November 5, 2009
![Page 86: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/86.jpg)
mod_substitute
• New in 2.2.8
• In-stream regex
• Replace a string, or a pattern, in the output
• Chain with other filters
Thursday, November 5, 2009
![Page 87: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/87.jpg)
mod_substitute
• One directive: Substitute
<Location /> AddOutputFilterByType SUBSTITUTE text/html Substitute s/ariel/verdana/ni </Location>
Thursday, November 5, 2009
![Page 88: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/88.jpg)
mod_substitute
• n = treat as a fixed string
• Default - treat as regex
<Location /> AddOutputFilterByType SUBSTITUTE text/html Substitute s/ariel/verdana/ni </Location>
Thursday, November 5, 2009
![Page 89: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/89.jpg)
mod_substitute
• i - Case insensitive match
• Default - Case sensitive
• n - string replacement, rather than regex
<Location /> AddOutputFilterByType SUBSTITUTE text/html Substitute s/ariel/verdana/ni </Location>
Thursday, November 5, 2009
![Page 90: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/90.jpg)
mod_substitute
• Replace ariel with verdana everywhere
• Filter content as it passes through. Perhaps on a proxy server.
<Location /> AddOutputFilterByType SUBSTITUTE text/html Substitute s/ariel/verdana/ni </Location>
Thursday, November 5, 2009
![Page 91: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/91.jpg)
More usefully ...
• Replace hard-coded hostnames in HTML proxied from a back-end
• s/intranet.local/www.corpsite.com/i
Thursday, November 5, 2009
![Page 92: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/92.jpg)
mod_ext_filter
• Calls an external command to filter the stream
• Hugely inefficient
Thursday, November 5, 2009
![Page 93: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/93.jpg)
mod_proxy_html
• Rewrites HTML at the proxy
• Swap hostnames for absolute URLs
• Third-party module
Thursday, November 5, 2009
![Page 94: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/94.jpg)
mod_line_edit
• Very similar to mod_substitute
• Third-party module
Thursday, November 5, 2009
![Page 95: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/95.jpg)
Further resources
• http://rewrite.drbacchus.com/
• http://people.apache.org/~rbowen
• “Definitive Guide to mod_rewrite” by Rich Bowen, from APress
• http://httpd.apache.org/docs/2.2/rewrite/
Thursday, November 5, 2009
![Page 96: mod_rewrite](https://reader033.vdocuments.net/reader033/viewer/2022060113/5571f97b49795991698fac8c/html5/thumbnails/96.jpg)
Questions?
http://people.apache.org/~rbowen/
Thursday, November 5, 2009