mod_rewrite
mod_rewrite 修改请求路径和查询字符串
它支持匹配正则表达式以及使用捕获的子字符串和其他占位符进行替换。
如果你的重写目标不包含任何问号(?
),那么查询字符串将不会被改变。
如果它包含?
,查询字符串将被?
后面的部分覆盖。要追加原始查询字符串,请使用%{request.query}
。
重要:重写只改变 URL,而不改变通过 docroot 或 alias 操作映射到的物理文件名。因此,你需要将 docroot 和 alias 操作放在重写之后。
如果你有条件重写,例如if !phys.is_file { rewrite ... }
,你需要在重写之前(以便检查物理文件)和之后(以构建新的物理路径)都配置 docroot/alias。
rewrite (操作)
修改请求路径和查询字符串
rewrite rule;
- 规则
- 一个简单的目标字符串或一个规则(将正则表达式映射到目标字符串),或者一个规则列表。
示例:始终重写
setup {
module_load "mod_rewrite";
}
rewrite "/new/path";
示例:如果匹配则重写
setup {
module_load "mod_rewrite";
}
rewrite "regex" => "/new/path";
示例:第一次匹配时重写
setup {
module_load "mod_rewrite";
}
rewrite ("regex1" => "/new/path1", ..., "regexN" => "/new/pathN");
示例:美观的 URL
注意:你真的应该将此类重写的逻辑移到你的应用程序中,并只将所有美观的 URL 重写到你的 index.php,而不要将操作放入查询字符串中。
setup {
module_load "mod_rewrite";
}
# bad: routing login in webserver config:
rewrite (
"^/article/(\d+)/.*$" => "/article.php?id=$1",
"^/download/(\d+)/(.*)$" => "/download.php?fileid=$1&filename=$2"
);
rewrite "^/user/(.+)$" => "/user.php?name=$1";
# good: handle it in the backend (easier to port the config)
rewrite "^/(article|download|user)(/|$)" => "/index.php";
rewrite_raw (操作)
修改请求路径和查询字符串,匹配并写入原始路径
rewrite_raw rule;
- 规则
- 一个简单的目标字符串或一个规则(将正则表达式映射到目标字符串),或者一个规则列表。
类似于rewrite
,但匹配原始路径(即 URL 解码和净化之前的路径),并且结果会被再次解码。
rewrite
将结果写入request.path
,并可能写入request.query
,然后使用 URL 编码从这些生成request.raw_path
。
rewrite_raw
写入request.raw_path
并将其解码为request.path
和request.query
;这意味着查询字符串总是被覆盖。
在这两种情况下,request.path
都会在之后被简化。
rewrite.debug (选项)
启用调试输出
rewrite.debug value;
默认值:false