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.pathrequest.query;这意味着查询字符串总是被覆盖。
在这两种情况下,request.path都会在之后被简化。

rewrite.debug (选项)

启用调试输出

rewrite.debug value;
默认值:false