SlideShare a Scribd company logo
1 of 68
Download to read offline
mod_rewrite
    Introduction to mod_rewrite
Rich Bowen, Web Guy, Asbury College
        rbowen@apache.org

 http://people.apache.org/~rbowen/

       ApacheCon US, 2006




                 1
Outline
Regex basics

RewriteRule

RewriteCond

RewriteMap

The evils of .htaccess files

Assorted odds and ends



                    2
mod_rewrite
is not magic
 Fear, more than
 complexity, makes
 mod_rewrite difficult




                    3
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




                     4
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




                   5
Line noise
  quot;Regular expressions
   are just line noise.
      I hate them!quot;
    (Heard 20 times per
      day on IRC)



          When you hear it often
          enough, you start to
          believe it

      6
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




                      7
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




                    8
.


. matches any character

“a.b” matches acb, axb, a@b, and so on

It also matches Decalb and Marbelized




                    9
+

+ means that something needs to appear one
or more times

“a+” matches a, aa, aaa, and
Stellaaaaaaaaaa!

The thing that is repeating isn’t necessarily
just a single character




                    10
*

* means that the previous thingy needs to
match zero or more times

This is subtly different from + and some
folks miss the distinction

“giraf*e” matches giraffe and girafe

It also matches girae




                    11
?

? means that the previous thingy needs to
match zero or one times

In other words, it makes it optional

“colou?r” matches color and colour




                    12
^
^ is called an anchor

It requires that the string start with the
pattern

^A matches ANDY but it does not match
CANDY

Pronounced “hat” or “caret” or “circumflex”
or “pointy-up thingy”



                    13
$

$ is the other anchor

It requires that the string end with the
pattern

a$ matches canada but not afghanistan




                    14
()

( ) allows you to group several characters
into one thingy

This allows you to apply repetition
characters (*, +, and ?) to a larger group of
characters.

“(ab)+” matches ababababababab




                    15
( ), continued
( ) allows you to capture a match so that you
can use it later.

The value of the matched bit is stored in a
variable 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


                    16
[]

[ ] 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




                     17
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.




                    18
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
  # Burninate ColdFusion!
  RewriteRule (.*).cfm$ $1.php [PT]
  # And there was much rejoicing. Yaaaay.




                       19
RewriteEngine
“RewriteEngine On” enables
the mod_rewrite rewriting
engine

No rewrite rules will be
performed unless this is
enabled in the active scope

It never hurts to say it again




                      20
RewriteLog
RewriteLog /www/logs/rewrite_log
RewriteLogLevel 9

You should turn on the RewriteLog before you
do any troubleshooting.




                     21
RewriteRule
 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




                     22
Example 1

SEO - “Search Engine Optimization”

Frequently based on misconceptions about
how search engines work

Typical strategy is to make “clean URLs” -
Avoid ?argument=value&xyz=123




                    23
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




                                24
Example 1, cont’d
RewriteRule ^/book/(.*)/(.*) 
  /cgi-bin/book.cgi?topic=$1&author=$2 [PT]

     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.
                         25
Flags

Flags can modify the behavior of a
RewriteRule

I used a flag in the example, and didn’t tell
you what it meant

So, here are the flags




                    26
By the way ...
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


                    28
RewriteRule flags
[Flag] appears at end of RewriteRule

More than one flag separated by commas

I recommend using flags even when the
default is what you want - it makes it easier
to read later

Each flag has a longer form, which you can
use for greater readability.

There’s *lots* of flags


                    29
Chain


[C] or [Chain]

Rules are considered as a whole. If one fails,
the entire chain is abandoned




                    30
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.

                               31
Env
   [E=var:val]

   Long form [env=...]

   Sets environment variable

   Note that most of the time, SetEnvIf works
   just fine

RewriteRule .jpg$ - [env=dontlog:1]



                         32
Forbidden
   [F] or [Forbidden] forces a 403 Forbidden
   response

   Consider mod_security instead for pattern-
   based URL blocking
  RewriteEngine On
  RewriteRule (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

                        33
Handler
[H=application/x-httpd-php]

Forces the use of a particular handler to
handle the resulting URL

Can often be replaced with using [PT] but is
quite a bit faster

Available in Apache 2.2



                    34
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.



                    35
Next
The [N] or [Next] flag is a good way to get
yourself into an infinite loop

It tells mod_rewrite to run the entire
ruleset again from the beginning

Can be useful for doing “global search and
replace” stuff

I find RewriteMap much more useful in those
situations

                   36
NoCase


[NC] or [nocase] makes the RewriteRule case
insensitive

Regular expressions are case-sensitive by
default




                   37
NoEscape

[NE] or [noescape] disables the default
behavior of escaping (url-encoding) special
characters like #, ?, and so on

Useful for redirecting to a page #anchor




                    38
NoSubreq

[NS] or [nosubreq] ensures that the rule
won’t run on subrequests

Subrequests are things like SSI evaluations

Image and css requests are NOT subrequests




                    39
Proxy
  [P] rules are served through a proxy
  subrequest

  mod_proxy must be installed for this flag to
  work
RewriteEngine On
RewriteRule (.*).(jpg|gif|png) 
 http://images.example.com$1.$2 [P]




                     40
Passthrough

[PT] or [passthrough]

Hands it back to the URL mapping phase

Treat this as though this was the original
request




                    41
QSAppend



[QSA] or [qsappend] appends to the query
string, rather than replacing it.




                   42
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://




                    43
Skip

    [S=n] or [skip=n] skips the next n
    RewriteRules

    This is very weird

    I’ve never used this in the real world. Could
    be used as a sort of inverse RewriteCond
    (viz WordPress)
RewriteRule %{REQUEST_FILENAME} -f [S=15]


                         44
Type
        [T=text/html]

        Forces the Mime type on the resulting URL

        Used to do this instead of [H] in some
        contexts

        Good to ensure that file-path redirects are
        handled correctly

RewriteRule ^(.+.php)s$ $1 [T=application/x-httpd-php-source]



                               45
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]




                     46
RewriteCond

The test string can be just about anything

Env vars, headers, or a literal string

Backreferences become %1, %2, etc




                     47
Looping
    Looping occurs when the target of a rewrite
    rule matches the pattern

    This results in an infinite loop of rewrites


RewriteCond %{REQUEST_URI} 
       !^/example.html
RewriteRule ^/example /example.html [PT]




                        48
Conditional rewrites
    Rewrites conditional on some arbitrary
    thingy

    Only first Rule is dependent



RewriteEngine   on
RewriteCond     %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond     %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule     ^page.html$    page.day.html
RewriteRule     ^page.html$    page.night.html



                         49
SSL Rewrites
   Redirect requests to https:// if the request
   was for http

   (In a .htaccess file)




RewriteCond %{HTTPS} !ON
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R]




                          50
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




                   51
RewriteMap - file
     File of one-to-one relationships

RewriteMap docsmap txt:/www/conf/docsmap.txt
RewriteRule ^/docs/(.*) ${docsmap:$1} [R,NE]


   Where docsmap.txt contains:

Alias http://httpd.apache.org/docs/mod_alias.html#alias
Redirect http://httpd.apache.org/docs/mod_alias.html#redirect
... etc



Requests for http://example.com/docs/something
now get redirected to the Apache docs site for
‘something’. [NE] makes the #anchor bit work.

                               52
Poor-man’s load balancing
        Random selection of server for “load
        balancing”

    RewriteMap servers rnd:/www/conf/servers.txt
    RewriteRule (.*) http://${servers:loadbalance}$1 [P,NS]


                 servers.txt contains:

     loadbalance mars|jupiter|saturn|neptune


Requests are now randomly distributed between the four
servers. The ‘NS’ ensures that the proxied URL doesn’t
get re-rewritten.
                              53
dbm
RewriteMap asbury 
       dbm:/usr/local/apache/conf/aliases.map

       Convert a one-to-one text mapping to a dbm
       file

       httxt2dbm utility (2.0)




                           54
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.pl
RewriteEngine On
RewriteRule (.*-.*) ${dash2score:$1} [PT]




                       55
dash2score.pl
 #!/usr/bin/perl
 $| = 1; # Turn off buffering
 while (<STDIN>) {
         s/-/_/g; # Replace - with _ globally
         print $_;
 }

Turning off buffering is necessary
because we need the output
immediately for each line we feed it.

Apache starts the script on server
startup, and keeps it running for the
life of the server process
SQL (in 2.3-HEAD)


Just committed on Monday

Have a SQL statement in the RewriteMap
directive which returns the mapping




                  57
.htaccess files

.htaccess files are evil

However, a lot of people have no choice

So ...




                    58
.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


                   59
.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 on
your home PC and test there with
RewriteLog enabled

                    60
.htaccess files
The rewrite pattern is relative to the
current directory

The rewrite target is also relative to the
current directory

In httpd.conf, the rewrite target is assumed
to be a file path. In .htaccess files, that file
path is relative to the current directory, so it
seems to be a URI redirect.


                     61
Further resources

http://rewrite.drbacchus.com/

“Definitive Guide to mod_rewrite” by Rich
Bowen, from APress

http://httpd.apache.org/docs-2.2/rewrite/




                   62
Questions?




    63
Bonus slides - Recipes



Redirect everything to a central handler




                   64
RewriteEngine On
RewriteCond %{REQUEST_URI} !handler.php
RewriteRule (.*) /handler.php?$1 [PT,L,NE]


     All requests are sent to handler.php
  The request is passed as a QUERY_STRING
argument to handler.php so that it knows what
                was requested.

                      65
Virtual Hosts



Rewrite a request to a directory based on
the requested hostname.




                   66
RewriteEngine On
RewriteCond %{HTTP_HOST} (.*).example.com [NC]
RewriteRule (.*) /home/%1/www$1

       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)

                           67
.phps source handler
RewriteRule (.*).phps 
  $1.php [H=application/x-httpd-php-source]



                           Syntax-highlighted code
                           rendering of any .php
                           file




                      68

More Related Content

What's hot

A reviravolta do desenvolvimento web
A reviravolta do desenvolvimento webA reviravolta do desenvolvimento web
A reviravolta do desenvolvimento webWallace Reis
 
Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101hendrikvb
 
8 Minutes On Rack
8 Minutes On Rack8 Minutes On Rack
8 Minutes On Rackdanwrong
 
Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2nottings
 
Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Alena Holligan
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworksdiego_k
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perlworr1244
 
You don’t know query - WordCamp UK Edinburgh 2012
You don’t know query - WordCamp UK Edinburgh 2012You don’t know query - WordCamp UK Edinburgh 2012
You don’t know query - WordCamp UK Edinburgh 2012l3rady
 
PHP - PDO Objects
PHP - PDO ObjectsPHP - PDO Objects
PHP - PDO ObjectsAJINKYA N
 
Php server variables
Php server variablesPhp server variables
Php server variablesJIGAR MAKHIJA
 
Introduction to Modern Perl
Introduction to Modern PerlIntroduction to Modern Perl
Introduction to Modern PerlDave Cross
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojobpmedley
 
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...King Foo
 
PHP Optimization
PHP OptimizationPHP Optimization
PHP Optimizationdjesch
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Adam Tomat
 
Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...Puppet
 

What's hot (20)

A reviravolta do desenvolvimento web
A reviravolta do desenvolvimento webA reviravolta do desenvolvimento web
A reviravolta do desenvolvimento web
 
Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101Web Apps in Perl - HTTP 101
Web Apps in Perl - HTTP 101
 
Mojo as a_client
Mojo as a_clientMojo as a_client
Mojo as a_client
 
8 Minutes On Rack
8 Minutes On Rack8 Minutes On Rack
8 Minutes On Rack
 
Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2Puppet camp chicago-automated_testing2
Puppet camp chicago-automated_testing2
 
Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016Demystifying Object-Oriented Programming - ZendCon 2016
Demystifying Object-Oriented Programming - ZendCon 2016
 
Perl6 in-production
Perl6 in-productionPerl6 in-production
Perl6 in-production
 
Rack Middleware
Rack MiddlewareRack Middleware
Rack Middleware
 
Perl web frameworks
Perl web frameworksPerl web frameworks
Perl web frameworks
 
Introduction to Perl
Introduction to PerlIntroduction to Perl
Introduction to Perl
 
You don’t know query - WordCamp UK Edinburgh 2012
You don’t know query - WordCamp UK Edinburgh 2012You don’t know query - WordCamp UK Edinburgh 2012
You don’t know query - WordCamp UK Edinburgh 2012
 
PHP - PDO Objects
PHP - PDO ObjectsPHP - PDO Objects
PHP - PDO Objects
 
Php server variables
Php server variablesPhp server variables
Php server variables
 
Introduction to Modern Perl
Introduction to Modern PerlIntroduction to Modern Perl
Introduction to Modern Perl
 
Webrtc mojo
Webrtc mojoWebrtc mojo
Webrtc mojo
 
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
Building Web Services with Zend Framework (PHP Benelux meeting 20100713 Vliss...
 
Php functions
Php functionsPhp functions
Php functions
 
PHP Optimization
PHP OptimizationPHP Optimization
PHP Optimization
 
Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018Supercharging WordPress Development in 2018
Supercharging WordPress Development in 2018
 
Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...Replacing "exec" with a type and provider: Return manifests to a declarative ...
Replacing "exec" with a type and provider: Return manifests to a declarative ...
 

Viewers also liked

Laureate's Paper REwrite
Laureate's Paper REwriteLaureate's Paper REwrite
Laureate's Paper REwriteHailey David
 
Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...
Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...
Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...Eelco Visser
 
Class 9 Cbse English Sample Paper Model 2
Class 9 Cbse English Sample Paper Model 2Class 9 Cbse English Sample Paper Model 2
Class 9 Cbse English Sample Paper Model 2Sunaina Rawat
 
Time to rewrite the rules of change in health and care
Time to rewrite the rules of change in health and careTime to rewrite the rules of change in health and care
Time to rewrite the rules of change in health and careNHS Improving Quality
 
Clear legal content for business benefit
Clear legal content for business benefitClear legal content for business benefit
Clear legal content for business benefitSimplified UK
 
350b paper 1 rewrite
350b paper 1 rewrite350b paper 1 rewrite
350b paper 1 rewriteChloe Smith
 
Writing a scientific paper
Writing a scientific paperWriting a scientific paper
Writing a scientific paperSylvie Noël
 
StrataGEM: A Generic Petri Net Verification Framework
StrataGEM: A Generic Petri Net Verification FrameworkStrataGEM: A Generic Petri Net Verification Framework
StrataGEM: A Generic Petri Net Verification FrameworkEdmundo López Bóbeda
 
What is a Thesis Statement?
What is a Thesis Statement?What is a Thesis Statement?
What is a Thesis Statement?kcfronk
 
5 parts of research paper
5 parts of research paper5 parts of research paper
5 parts of research paperQueene Balaoro
 

Viewers also liked (15)

Best of scruples
Best of scruplesBest of scruples
Best of scruples
 
Publishing
PublishingPublishing
Publishing
 
Laureate's Paper REwrite
Laureate's Paper REwriteLaureate's Paper REwrite
Laureate's Paper REwrite
 
Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...
Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...
Composing Source-to-Source Data-Flow Transformations with Rewriting Strategie...
 
Class 9 Cbse English Sample Paper Model 2
Class 9 Cbse English Sample Paper Model 2Class 9 Cbse English Sample Paper Model 2
Class 9 Cbse English Sample Paper Model 2
 
Time to rewrite the rules of change in health and care
Time to rewrite the rules of change in health and careTime to rewrite the rules of change in health and care
Time to rewrite the rules of change in health and care
 
Co-author of a world-class paper written as a PhD-candidate | Rick Pleijhuis...
Co-author of a world-class paper written as a PhD-candidate  | Rick Pleijhuis...Co-author of a world-class paper written as a PhD-candidate  | Rick Pleijhuis...
Co-author of a world-class paper written as a PhD-candidate | Rick Pleijhuis...
 
Paper 1 Rewrite
Paper 1 RewritePaper 1 Rewrite
Paper 1 Rewrite
 
Clear legal content for business benefit
Clear legal content for business benefitClear legal content for business benefit
Clear legal content for business benefit
 
350b paper 1 rewrite
350b paper 1 rewrite350b paper 1 rewrite
350b paper 1 rewrite
 
Writing a scientific paper
Writing a scientific paperWriting a scientific paper
Writing a scientific paper
 
StrataGEM: A Generic Petri Net Verification Framework
StrataGEM: A Generic Petri Net Verification FrameworkStrataGEM: A Generic Petri Net Verification Framework
StrataGEM: A Generic Petri Net Verification Framework
 
Indexed Hive
Indexed HiveIndexed Hive
Indexed Hive
 
What is a Thesis Statement?
What is a Thesis Statement?What is a Thesis Statement?
What is a Thesis Statement?
 
5 parts of research paper
5 parts of research paper5 parts of research paper
5 parts of research paper
 

Similar to Mod_rewrite Guide: Regular Expressions and RewriteRule Flags Explained

mod_rewrite bootcamp, Ohio LInux 2011
mod_rewrite bootcamp, Ohio LInux 2011mod_rewrite bootcamp, Ohio LInux 2011
mod_rewrite bootcamp, Ohio LInux 2011Rich Bowen
 
RubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteRubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteDr Nic Williams
 
Apache - Mod-Rewrite
Apache - Mod-RewriteApache - Mod-Rewrite
Apache - Mod-RewriteMarakana Inc.
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceJesse Vincent
 
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret SauceBeijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret SauceJesse Vincent
 
RSpec 3: The new, the old, the good
RSpec 3: The new, the old, the goodRSpec 3: The new, the old, the good
RSpec 3: The new, the old, the goodmglrnm
 
In-Depth Guide On WordPress Coding Standards For PHP & HTML
In-Depth Guide On WordPress Coding Standards For PHP & HTMLIn-Depth Guide On WordPress Coding Standards For PHP & HTML
In-Depth Guide On WordPress Coding Standards For PHP & HTMLeSparkBiz
 
Coder Presentation Szeged
Coder Presentation SzegedCoder Presentation Szeged
Coder Presentation SzegedDoug Green
 
[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress DevelopmentAdam Tomat
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Benjamin Bock
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescriptDavid Furber
 
Coder Presentation Boston
Coder Presentation BostonCoder Presentation Boston
Coder Presentation BostonDoug Green
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasminePaulo Ragonha
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principlesPerl Careers
 
Perly Parsing with Regexp::Grammars
Perly Parsing with Regexp::GrammarsPerly Parsing with Regexp::Grammars
Perly Parsing with Regexp::GrammarsWorkhorse Computing
 
Angular JS in 2017
Angular JS in 2017Angular JS in 2017
Angular JS in 2017Ayush Sharma
 
The Art of Refactoring | Asmit Ghimire | Gurzu.pdf
The Art of Refactoring | Asmit Ghimire | Gurzu.pdfThe Art of Refactoring | Asmit Ghimire | Gurzu.pdf
The Art of Refactoring | Asmit Ghimire | Gurzu.pdfGurzuInc
 

Similar to Mod_rewrite Guide: Regular Expressions and RewriteRule Flags Explained (20)

mod_rewrite
mod_rewritemod_rewrite
mod_rewrite
 
mod_rewrite bootcamp, Ohio LInux 2011
mod_rewrite bootcamp, Ohio LInux 2011mod_rewrite bootcamp, Ohio LInux 2011
mod_rewrite bootcamp, Ohio LInux 2011
 
RubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - KeynoteRubyEnRails2007 - Dr Nic Williams - Keynote
RubyEnRails2007 - Dr Nic Williams - Keynote
 
Apache - Mod-Rewrite
Apache - Mod-RewriteApache - Mod-Rewrite
Apache - Mod-Rewrite
 
Hiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret SauceHiveminder - Everything but the Secret Sauce
Hiveminder - Everything but the Secret Sauce
 
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret SauceBeijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
 
RSpec 3: The new, the old, the good
RSpec 3: The new, the old, the goodRSpec 3: The new, the old, the good
RSpec 3: The new, the old, the good
 
In-Depth Guide On WordPress Coding Standards For PHP & HTML
In-Depth Guide On WordPress Coding Standards For PHP & HTMLIn-Depth Guide On WordPress Coding Standards For PHP & HTML
In-Depth Guide On WordPress Coding Standards For PHP & HTML
 
Coder Presentation Szeged
Coder Presentation SzegedCoder Presentation Szeged
Coder Presentation Szeged
 
[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development[Bristol WordPress] Supercharging WordPress Development
[Bristol WordPress] Supercharging WordPress Development
 
Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)Ruby Topic Maps Tutorial (2007-10-10)
Ruby Topic Maps Tutorial (2007-10-10)
 
Real life-coffeescript
Real life-coffeescriptReal life-coffeescript
Real life-coffeescript
 
Coder Presentation Boston
Coder Presentation BostonCoder Presentation Boston
Coder Presentation Boston
 
Ruby on Rails
Ruby on RailsRuby on Rails
Ruby on Rails
 
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and JasmineSingle Page Web Applications with CoffeeScript, Backbone and Jasmine
Single Page Web Applications with CoffeeScript, Backbone and Jasmine
 
PSGI and Plack from first principles
PSGI and Plack from first principlesPSGI and Plack from first principles
PSGI and Plack from first principles
 
Perly Parsing with Regexp::Grammars
Perly Parsing with Regexp::GrammarsPerly Parsing with Regexp::Grammars
Perly Parsing with Regexp::Grammars
 
Angular JS in 2017
Angular JS in 2017Angular JS in 2017
Angular JS in 2017
 
The Art of Refactoring | Asmit Ghimire | Gurzu.pdf
The Art of Refactoring | Asmit Ghimire | Gurzu.pdfThe Art of Refactoring | Asmit Ghimire | Gurzu.pdf
The Art of Refactoring | Asmit Ghimire | Gurzu.pdf
 
Ruby on Rails Presentation
Ruby on Rails PresentationRuby on Rails Presentation
Ruby on Rails Presentation
 

Recently uploaded

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 3652toLead Limited
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxLoriGlavin3
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 

Recently uploaded (20)

DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365Ensuring Technical Readiness For Copilot in Microsoft 365
Ensuring Technical Readiness For Copilot in Microsoft 365
 
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptxA Deep Dive on Passkeys: FIDO Paris Seminar.pptx
A Deep Dive on Passkeys: FIDO Paris Seminar.pptx
 
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 

Mod_rewrite Guide: Regular Expressions and RewriteRule Flags Explained

  • 1. mod_rewrite Introduction to mod_rewrite Rich Bowen, Web Guy, Asbury College rbowen@apache.org http://people.apache.org/~rbowen/ ApacheCon US, 2006 1
  • 2. Outline Regex basics RewriteRule RewriteCond RewriteMap The evils of .htaccess files Assorted odds and ends 2
  • 3. mod_rewrite is not magic Fear, more than complexity, makes mod_rewrite difficult 3
  • 4. 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 4
  • 5. 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 5
  • 6. Line noise quot;Regular expressions are just line noise. I hate them!quot; (Heard 20 times per day on IRC) When you hear it often enough, you start to believe it 6
  • 7. 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 7
  • 8. 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 8
  • 9. . . matches any character “a.b” matches acb, axb, a@b, and so on It also matches Decalb and Marbelized 9
  • 10. + + means that something needs to appear one or more times “a+” matches a, aa, aaa, and Stellaaaaaaaaaa! The thing that is repeating isn’t necessarily just a single character 10
  • 11. * * means that the previous thingy needs to match zero or more times This is subtly different from + and some folks miss the distinction “giraf*e” matches giraffe and girafe It also matches girae 11
  • 12. ? ? means that the previous thingy needs to match zero or one times In other words, it makes it optional “colou?r” matches color and colour 12
  • 13. ^ ^ is called an anchor It requires that the string start with the pattern ^A matches ANDY but it does not match CANDY Pronounced “hat” or “caret” or “circumflex” or “pointy-up thingy” 13
  • 14. $ $ is the other anchor It requires that the string end with the pattern a$ matches canada but not afghanistan 14
  • 15. () ( ) allows you to group several characters into one thingy This allows you to apply repetition characters (*, +, and ?) to a larger group of characters. “(ab)+” matches ababababababab 15
  • 16. ( ), continued ( ) allows you to capture a match so that you can use it later. The value of the matched bit is stored in a variable 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 16
  • 17. [] [ ] 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 17
  • 18. 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. 18
  • 19. 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 # Burninate ColdFusion! RewriteRule (.*).cfm$ $1.php [PT] # And there was much rejoicing. Yaaaay. 19
  • 20. RewriteEngine “RewriteEngine On” enables the mod_rewrite rewriting engine No rewrite rules will be performed unless this is enabled in the active scope It never hurts to say it again 20
  • 21. RewriteLog RewriteLog /www/logs/rewrite_log RewriteLogLevel 9 You should turn on the RewriteLog before you do any troubleshooting. 21
  • 22. RewriteRule 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 22
  • 23. Example 1 SEO - “Search Engine Optimization” Frequently based on misconceptions about how search engines work Typical strategy is to make “clean URLs” - Avoid ?argument=value&xyz=123 23
  • 24. 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 24
  • 25. Example 1, cont’d RewriteRule ^/book/(.*)/(.*) /cgi-bin/book.cgi?topic=$1&author=$2 [PT] 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. 25
  • 26. Flags Flags can modify the behavior of a RewriteRule I used a flag in the example, and didn’t tell you what it meant So, here are the flags 26
  • 27.
  • 28. By the way ... 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 28
  • 29. RewriteRule flags [Flag] appears at end of RewriteRule More than one flag separated by commas I recommend using flags even when the default is what you want - it makes it easier to read later Each flag has a longer form, which you can use for greater readability. There’s *lots* of flags 29
  • 30. Chain [C] or [Chain] Rules are considered as a whole. If one fails, the entire chain is abandoned 30
  • 31. 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. 31
  • 32. Env [E=var:val] Long form [env=...] Sets environment variable Note that most of the time, SetEnvIf works just fine RewriteRule .jpg$ - [env=dontlog:1] 32
  • 33. Forbidden [F] or [Forbidden] forces a 403 Forbidden response Consider mod_security instead for pattern- based URL blocking RewriteEngine On RewriteRule (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 33
  • 34. Handler [H=application/x-httpd-php] Forces the use of a particular handler to handle the resulting URL Can often be replaced with using [PT] but is quite a bit faster Available in Apache 2.2 34
  • 35. 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. 35
  • 36. Next The [N] or [Next] flag is a good way to get yourself into an infinite loop It tells mod_rewrite to run the entire ruleset again from the beginning Can be useful for doing “global search and replace” stuff I find RewriteMap much more useful in those situations 36
  • 37. NoCase [NC] or [nocase] makes the RewriteRule case insensitive Regular expressions are case-sensitive by default 37
  • 38. NoEscape [NE] or [noescape] disables the default behavior of escaping (url-encoding) special characters like #, ?, and so on Useful for redirecting to a page #anchor 38
  • 39. NoSubreq [NS] or [nosubreq] ensures that the rule won’t run on subrequests Subrequests are things like SSI evaluations Image and css requests are NOT subrequests 39
  • 40. Proxy [P] rules are served through a proxy subrequest mod_proxy must be installed for this flag to work RewriteEngine On RewriteRule (.*).(jpg|gif|png) http://images.example.com$1.$2 [P] 40
  • 41. Passthrough [PT] or [passthrough] Hands it back to the URL mapping phase Treat this as though this was the original request 41
  • 42. QSAppend [QSA] or [qsappend] appends to the query string, rather than replacing it. 42
  • 43. 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:// 43
  • 44. Skip [S=n] or [skip=n] skips the next n RewriteRules This is very weird I’ve never used this in the real world. Could be used as a sort of inverse RewriteCond (viz WordPress) RewriteRule %{REQUEST_FILENAME} -f [S=15] 44
  • 45. Type [T=text/html] Forces the Mime type on the resulting URL Used to do this instead of [H] in some contexts Good to ensure that file-path redirects are handled correctly RewriteRule ^(.+.php)s$ $1 [T=application/x-httpd-php-source] 45
  • 46. 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] 46
  • 47. RewriteCond The test string can be just about anything Env vars, headers, or a literal string Backreferences become %1, %2, etc 47
  • 48. Looping Looping occurs when the target of a rewrite rule matches the pattern This results in an infinite loop of rewrites RewriteCond %{REQUEST_URI} !^/example.html RewriteRule ^/example /example.html [PT] 48
  • 49. Conditional rewrites Rewrites conditional on some arbitrary thingy Only first Rule is dependent RewriteEngine on RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700 RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900 RewriteRule ^page.html$ page.day.html RewriteRule ^page.html$ page.night.html 49
  • 50. SSL Rewrites Redirect requests to https:// if the request was for http (In a .htaccess file) RewriteCond %{HTTPS} !ON RewriteRule (.*) https://%{HTTP_HOST}/$1 [R] 50
  • 51. 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 51
  • 52. RewriteMap - file File of one-to-one relationships RewriteMap docsmap txt:/www/conf/docsmap.txt RewriteRule ^/docs/(.*) ${docsmap:$1} [R,NE] Where docsmap.txt contains: Alias http://httpd.apache.org/docs/mod_alias.html#alias Redirect http://httpd.apache.org/docs/mod_alias.html#redirect ... etc Requests for http://example.com/docs/something now get redirected to the Apache docs site for ‘something’. [NE] makes the #anchor bit work. 52
  • 53. Poor-man’s load balancing Random selection of server for “load balancing” RewriteMap servers rnd:/www/conf/servers.txt RewriteRule (.*) http://${servers:loadbalance}$1 [P,NS] servers.txt contains: loadbalance mars|jupiter|saturn|neptune Requests are now randomly distributed between the four servers. The ‘NS’ ensures that the proxied URL doesn’t get re-rewritten. 53
  • 54. dbm RewriteMap asbury dbm:/usr/local/apache/conf/aliases.map Convert a one-to-one text mapping to a dbm file httxt2dbm utility (2.0) 54
  • 55. 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.pl RewriteEngine On RewriteRule (.*-.*) ${dash2score:$1} [PT] 55
  • 56. dash2score.pl #!/usr/bin/perl $| = 1; # Turn off buffering while (<STDIN>) { s/-/_/g; # Replace - with _ globally print $_; } Turning off buffering is necessary because we need the output immediately for each line we feed it. Apache starts the script on server startup, and keeps it running for the life of the server process
  • 57. SQL (in 2.3-HEAD) Just committed on Monday Have a SQL statement in the RewriteMap directive which returns the mapping 57
  • 58. .htaccess files .htaccess files are evil However, a lot of people have no choice So ... 58
  • 59. .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 59
  • 60. .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 on your home PC and test there with RewriteLog enabled 60
  • 61. .htaccess files The rewrite pattern is relative to the current directory The rewrite target is also relative to the current directory In httpd.conf, the rewrite target is assumed to be a file path. In .htaccess files, that file path is relative to the current directory, so it seems to be a URI redirect. 61
  • 62. Further resources http://rewrite.drbacchus.com/ “Definitive Guide to mod_rewrite” by Rich Bowen, from APress http://httpd.apache.org/docs-2.2/rewrite/ 62
  • 64. Bonus slides - Recipes Redirect everything to a central handler 64
  • 65. RewriteEngine On RewriteCond %{REQUEST_URI} !handler.php RewriteRule (.*) /handler.php?$1 [PT,L,NE] All requests are sent to handler.php The request is passed as a QUERY_STRING argument to handler.php so that it knows what was requested. 65
  • 66. Virtual Hosts Rewrite a request to a directory based on the requested hostname. 66
  • 67. RewriteEngine On RewriteCond %{HTTP_HOST} (.*).example.com [NC] RewriteRule (.*) /home/%1/www$1 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) 67
  • 68. .phps source handler RewriteRule (.*).phps $1.php [H=application/x-httpd-php-source] Syntax-highlighted code rendering of any .php file 68