Nginx的rewrite
指令提供了非常灵活的方式来重写或重定向客户端的请求URI。以下是一些基本的实战例子来说明如何在Nginx中配置rewrite
规则:
示例1:从查询字符串参数转换为路径参数
原始情况:
用户请求 http://www.example.com/index.php?id=123
期望转换:
转换为 http://www.example.com/article/123
location / {
rewrite ^/index.php?id=(\d+)$ /article/$1 permanent;
}
在这个例子中,正则表达式 ^/index.php?id=(\d+)$
匹配以 /index.php?id=
开始且后面跟着数字的请求,并捕获这个数字。$1
在重写目标中引用了捕获的数字,然后使用 permanent
参数发起一个301永久重定向。
示例2:从HTTP重定向到HTTPS
原始情况:
用户通过HTTP请求 http://www.example.com
期望转换:
强制重定向到HTTPS版本 https://www.example.com
server {
listen 80;
server_name www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
server_name www.example.com;
# SSL 配置部分省略...
location / {
# 此处是HTTPS服务的其他配置
}
}
在这个例子中,我们没有直接使用rewrite
,而是使用return
指令发送一个301重定向响应给客户端,强制其使用HTTPS。
示例3:内部重写(不改变浏览器地址栏)
原始情况:
用户请求 http://www.example.com/blog/post1
期望内部处理:
实际请求后端的 /app/posts.php?slug=post1
而不改变用户的可见URL
location /blog/ {
rewrite ^/blog/(post\d+)/$ /app/posts.php?slug=$1 last;
}
location /app/ {
try_files $uri $uri/ =404;
# 这里是PHP-FPM或者其他后端服务器的配置
}
这里使用了 last
标志,表示完成当前rewrite循环并继续执行后续的location处理。这样,虽然用户看到的是 /blog/post1
,但Nginx会把请求转发给 /app/posts.php
,并传递相应的参数。
注意事项:
rewrite
规则可以在server
、location
或if
上下文中使用。- 使用
break
标志停止当前rewrite循环。 - 使用
last
标志继续执行新的location查找。 - 使用
permanent
或redirect
发起外部重定向,并返回301或302状态码给客户端。 - 在复杂重写规则中,确保避免死循环,并合理使用
break
、last
等标志控制流程。 - Nginx的
rewrite_log
可以开启详细重写日志记录,有助于调试规则。
根据实际情况调整这些例子以适应您的具体需求。在编写规则时,务必考虑性能和正则表达式的效率。