URL重写(URL Rewriting)是指在不改变实际内容的情况下,修改用户浏览器中显示的URL地址。Nginx通过rewrite指令实现这一功能。
基本语法:
rewrite regex replacement [flag];
last
- 停止处理当前rewrite指令集,用新URI重新匹配locationbreak
- 停止处理当前rewrite指令集redirect
- 返回302临时重定向permanent
- 返回301永久重定向# 将 /product/123 重写为 /product.php?id=123
rewrite ^/product/(\d+)$ /product.php?id=$1 last;
# 将 /index.php/foo/bar 重写为 /foo/bar
rewrite ^/index\.php/(.*) /$1 permanent;
if ($scheme != "https") {
rewrite ^ https://$host$request_uri? permanent;
}
server {
listen 80;
server_name example.com;
return 301 $scheme://www.example.com$request_uri;
}
server {
listen 80;
server_name www.example.com;
# 主配置内容
}
# 将 /about 重写为 /about.php
rewrite ^/([^/\.]+)/?$ /$1.php last;
# 确保直接访问.php文件时重定向到无扩展名URL
if ($request_uri ~ ^/(.*)\.php$) {
return 301 /$1;
}
# 将 /category/5/page/2 重写为 /category.php?id=5&page=2
rewrite ^/category/(\d+)/page/(\d+)$ /category.php?id=$1&page=$2 last;
301重定向:确保旧URL正确重定向到新URL
rewrite ^/old-page$ /new-page permanent;
规范化URL:统一URL格式(尾部斜杠、大小写等)
# 确保URL以斜杠结尾
rewrite ^/(.*[^/])$ /$1/ permanent;
避免重复内容:防止同一内容通过多个URL访问
# 防止带参数的重复URL
if ($args ~* "^(.*)&?utm_[^=]+=[^&]*(?:&(.*))?$") {
set $args $1$2;
rewrite ^(.*)$ $1? permanent;
}
静态化动态URL:提升搜索引擎友好度
rewrite ^/products/([a-z0-9-]+)-([0-9]+)\.html$ /product.php?name=$1&id=$2 last;
# 仅当不是真实文件或目录时才重写
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php?q=$1 last;
}
# 将 /blog/2023/05/20/sample-post 重写为 /blog.php?year=2023&month=05&day=20&post=sample-post
rewrite ^/blog/(\d{4})/(\d{2})/(\d{2})/([^/]+)/?$ /blog.php?year=$1&month=$2&day=$3&post=$4 last;
set $mobile_rewrite do_not_perform;
if ($http_user_agent ~* "(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino") {
set $mobile_rewrite perform;
}
if ($mobile_rewrite = perform) {
rewrite ^(.*)$ /mobile$1 last;
}
测试配置语法:
nginx -t
查看重写日志:
rewrite_log on;
error_log /var/log/nginx/error.log notice;
使用curl测试:
curl -I http://example.com/old-url
通过合理配置Nginx的URL重写规则,可以显著提升网站的用户体验和SEO效果,同时保持后端系统的简洁性。