rewrite与return
在 Nginx 中,rewrite
和重定向都是用于改变 URL 的机制,但它们的工作方式和应用场景有所不同。以下是它们的详细解释和区别:
1. rewrite重写
rewrite 是在服务器内部改变 URL,客户端不会察觉到 URL 的变化。rewrite
通常用于将一个 URL 模式匹配到另一个 URL 模式,而不改变浏览器中的 URL。
语法:
rewrite 正则表达式 替换目标 [标志];
示例:
location /oldpage {
rewrite ^/oldpage/(.*)$ /newpage/$1 last;
}
在这个例子中,当请求 /oldpage/something
时,Nginx 会将其内部重写为 /newpage/something
,但浏览器中的 URL 不会改变。
常用标志:
last
:停止处理当前的location
块,并使用重写后的 URI 重新搜索新的location
匹配。break
:停止处理当前的location
块,并且不再进行任何重写或重定向。redirect
:返回一个临时的重定向给客户端。permanent
:返回一个永久重定向给客户端。
2. return重定向
重定向是让客户端浏览器实际改变 URL。Nginx 返回一个 HTTP 状态码(通常是 301 永久重定向或 302 临时重定向),告诉客户端浏览器去请求一个新的 URL。
示例:
location /oldpage {
return 301 /newpage;
}
在这个例子中,当请求 /oldpage
时,Nginx 会返回一个 301 永久重定向状态码,告诉客户端浏览器去请求 /newpage
。浏览器中的 URL 会改变为 /newpage
。
重写与重定向的区别
-
URL 是否改变:
- rewrite 重写:URL 不会在客户端浏览器中改变。
- return 重定向:URL 会在客户端浏览器中改变。
-
HTTP 状态码:
- rewrite 重写:不涉及 HTTP 状态码。
- return 重定向:返回 301 或 302 状态码。
-
应用场景:
- rewrite 重写:常用于内部 URL 重写,比如将动态 URL 重写为静态 URL,或者将复杂的 URL 结构简化。
- return 重定向:常用于永久或临时改变 URL,比如网站改版后将旧 URL 重定向到新 URL。
综合示例
server {
listen 80;
server_name example.com;
location /oldpage {
# 内部重写
rewrite ^/oldpage/(.*)$ /newpage/$1 last;
}
location /movedpage {
# 临时重定向
return 302 /newpage;
}
location /permanentlymovedpage {
# 永久重定向
return 301 /newpage;
}
}
在这个示例中:
- 请求
/oldpage/something
会被重写为/newpage/something
,但浏览器中的 URL 不会改变。 - 请求
/movedpage
会被临时重定向到/newpage
,浏览器中的 URL 会改变,并且状态码是 302。 - 请求
/permanentlymovedpage
会被永久重定向到/newpage
,浏览器中的 URL 会改变,并且状态码是 301。
总结
- 使用
rewrite
进行内部 URL 重写,客户端不会察觉到 URL 的变化。 - 使用
return
进行重定向,客户端会察觉到 URL 的变化,并且会收到一个 HTTP 状态码。
根据具体需求选择合适的机制,可以有效地管理和优化你的网站 URL 结构。