rewrite
用途
实现URL地址的重写与跳转。
语法
rewrite regex replacement [flag];
- regex:用于匹配URI的正则表达式。
- replacement:替换匹配URI的新URI。
- flag:指定如何处理替换后的URI的标志。
标志(Flags)
- last:停止处理当前 rewrite 指令集,重新搜索匹配URI的 location 块。
- break:停止处理当前的 rewrite 指令集。
- redirect:返回302临时重定向。
- permanent:返回301永久重定向。
上下文配置
rewrite指令可以在 server、location 和 if 上下文中使用。
示例1:URL重写
将 /old-url/ 重写为 /new-url/ :
location /old-url/ {
rewrite ^/old-url/(.*)$ /new-url/$1 last;
}
示例2:删除URL中的 .php 扩展名
当请求 /some-page.php 时,重定向到 /some-page :
location / {
if ($request_filename !-f) {
rewrite ^(.+)\.php(.*)$ $1$2 permanent;
}
}
注意:虽然上面的示例使用了 if 指令,但通常尽可能避免在 nginx 配置中使用 if,因为它可能会导致性能问题。更好的方法可能是使用 try_files 指令或其他方法。
示例3:防止目录列表
如果你不希望用户能够列出目录的内容,你可以使用 rewrite 指令来重定向到一个错误页面或另一个 URI:
location /some-directory/ {
autoindex off; # 首先关闭目录列表
if (!-e $request_filename) {
rewrite ^/some-directory/(.*)$ /error-page.html last;
}
}
总结
- 当使用 rewrite 指令时,确保了解正则表达式的语法和 nginx 的配置方式。
- 过度使用 rewrite 可能会导致性能下降,特别是在处理大量请求时。因此,尽量保持配置简单和高效。
- 在生产环境中更改配置之前,最好在测试环境中验证更改。
官方说明:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite
if
用途
根据特定的条件来执行相应的配重块。
语法
if (condition) {
...
}
condition形式
- 变量比较,如:`$variable = value`。
- 变量与正则表达式的匹配, 如:`$variable ~ pattern`。
- 逻辑操作:`!`(非)、 `-f`(文件存在)、 `-d`(目录存在)、 `-e`(文件、目录、符号链接存在)、 `-x`(可执行文件存在)等。
- 正则表达式中包含 “}” 或 “;” 字符,整个表达式应该用单引号或双引号括起来。
上下文配置
if 指令在 server 和 location 上下文使用。
示例1:针对MSIE浏览器的重定向
当请求的User-Agent头包含MSIE(Internet Explorer的旧版本)时,Nginx 会将请求重写为 /msie/ 加上原始请求的路径,并停止处理后续的重写规则(break标志)。
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
示例2:从Cookie中提取ID
使用正则表达式从Cookie头中提取id的值。如果Cookie中包含形如id=some_value;或id=some_value的片段,那么变量$id将被设置为some_value。
if ($http_cookie ~* "id=([^;]+)(?:;|$)") {
set $id $1;
}
示例3:禁止POST方法
如果请求的方法是 POST,Nginx 将返回405状态码(方法不允许)。这通常用于确保某个位置或服务器仅支持 GET 或其他 HTTP 方法,而不支持 POST。
if ($request_method = POST) {
return 405;
}
示例4:基于$slow变量的带宽限制
如果变量 $slow 为真(需要在其他地方定义或根据其他条件设置),Nginx 将限制发送到客户端的响应速度为每秒10KB。用于防止在慢速连接上发送大量数据,或在某些条件下有意地限制带宽。
if ($slow) {
limit_rate 10k;
}
示例5:基于$invalid_referer的访问控制
如果变量 $invalid_referer 为真(表示请求的 Referer 头无效或不存在,或者不符合某些预期的模式),Nginx 将返回 403 状态码(禁止访问)。常用于防止热链接、保护资源或实施其他基于 Referer 的访问控制策略。
if ($invalid_referer) {
return 403;
}
官方说明:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if
set
用途
用于设置变量。
语法
set $variable value;
上下文配置
set 指令 只能在 server 上下文中使用。
示例:
如果请求的 User-Agent 头包含 MSIE,则 $user_agent 变量将被设置为 "msie",否则它将保持为空字符串。然后,这个变量的值将被包含在返回的响应体中。
location /test {
set $user_agent "";
if ($http_user_agent ~ MSIE) {
set $user_agent "msie";
}
return 200 "User Agent: $user_agent";
}
官方说明:
http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#set
http://nginx.org/en/docs/stream/ngx_stream_set_module.html#set
若有收获,就点个赞吧