Mod redirect » History » Revision 35
Revision 34 (gstrauss, 2021-08-26 15:53) → Revision 35/36 (gstrauss, 2024-03-13 17:44)
h1. URL Redirection
{{>toc}}
*Module: mod_redirect*
h2. Description
The redirect module is used to specify redirects for a set of URLs.
h2. Options
table{margin-left: 2em}.
|_.option |_. description |_. note |
| url.redirect | URL path matching rules to generate HTTP Location redirect | |
| url.redirect-code | defines the http code that is sent with the redirect URL (default: 301)
(default: 308 for HTTP/1.1 and later (since 1.4.75)) | (since 1.4.31) |
h3. url.redirect-code
HTTP status code sent with the HTTP redirect (default: 301)
e.g. @url.redirect-code = 302@
If the client should use the same method (e.g. POST) to send a request to the redirect target, then code 307 or 308 should be used.
e.g. @url.redirect-code = 307@
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
h3. url.redirect
URL path matching rules to generate HTTP Location redirect
<pre>
url.redirect = (
"^/show/([0-9]+)/([0-9]+)$" => "https://www.example.org/show.php?isdn=$1&page$2",
"^/get/([0-9]+)/([0-9]+)$" => "https://www.example.org/get.php?isdn=$1&page$2"
)
# make an external redirect from any www.host (with www.) to the host (without www.)
$HTTP["host"] =~ "^www\.(.*)$" {
url.redirect = ("" => "https://%1${url.path}${qsa}")
}
</pre>
(more detailed documentation can be found in the [[Docs_ModRewrite#Regular-Expressions|Regular Expression]] section of [[Docs_ModRewrite|mod_rewrite]] doc)
Note that the "%1" in the @url.redirect@ target refers to the parenthesized subexpression in the conditional regexp (.*) directly enclosing the @url.redirect@. It *does not* have the meaning that "%1" would have in evhost.path-pattern (where it would mean 'top-level domain'). If @url.redirect@ is specified within a regex conditional (@=~@), % patterns are replaced by the corresponding groups from the condition regex. %1 is replaced with the first subexpression, %2 with the second, etc. %0 is replaced by the entire substring matching the regexp. See above and below for examples using % patterns. A negative match (@!~@) does not save any % patterns.
Redirect rules are evaluated up until the first matched redirect rule. As a special case to allow short-circuiting the redirect rules _without_ triggering a redirect, specify a blank target: <code>url.redirect = ( "^/do-not-redirect/this/path" => "" )</code>. Then, a further catch-all redirect rule might redirect everything else. This can be used as an alternative to nested conditions inside other conditions. The blank target special-case is available in version 1.4.40 or later.
h2. Examples
[[HowToRedirectHttpToHttps]] - Redirecting any HTTP request to HTTPS aka forcing SSL
(more detailed documentation can be found in the [[Docs_ModRewrite#Regular-Expressions|Regular Expression]] section of [[Docs_ModRewrite|mod_rewrite]] doc)
Some people love the www part in the url. A general solution to move all non "www." hosts to the "www." equivalent:
<pre>
$HTTP["host"] !~ "^www\." {
url.redirect = ("" => "https://www.${url.authority}${url.path}${qsa}")
}
</pre>
Redirect all *.example.org subdomains except a few to www.example.org:
<pre>
$HTTP["host"] !~ "^(?:www|mail|mysql)\.example\.org$" {
url.redirect = ("" => "https://www.example.org${url.path}${qsa}")
}
</pre>
Redirect example.xxx, www.example.net, www.example.org to www.example.com
<pre>
$HTTP["host"] =~ "^(?:example\.(?:com|net|org)|(?:www\.)?example\.(?:net|org))$" {
url.redirect = ( "" => "https://www.example.com${url.path}${qsa}" )
}
</pre>
In the other direction, redirect www.example.com to example.com
<pre>
$HTTP["host"] == "www.example.com" {
url.redirect = ( "" => "https://example.com${url.path}${qsa}" )
}
</pre>
Redirect all domains starting "www." to domains without "www." prefix
<pre>
$HTTP["host"] =~ "^www\.(.*)$" {
url.redirect = ( "" => "https://%1${url.path}${qsa}" )
}
</pre>
Similar configurations can be used to redirect all .net/.org etc. requests to the dot-com address for the site:
<pre>
$HTTP["host"] =~ "^(?:www\.)?example\.(?:net|org)$" {
url.redirect = ( "" => "https://example.com${url.path}${qsa}" )
}
</pre>