nginx url跳转、rewrite实例
nginx 的 rewrite 语法
语法: rewrite regex replacement flag
默认: none
作用域: server, location, if
此指令根据表达式来更改URI,或修改字符串。
指令根据配置文件中的顺序来执行。
注意:
重写表达式只对相对路径有效。如果想配对主机名,应该使用if语句。
rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的,因此,只是加上了一个?号和后面我们想要的一个小小的参数 ***https=1就可以了。
nginx的rewrite规则参考:
1 | ~ 为区分大小写匹配 |
多目录转成参数
1 | if (!-d $request_filename) { |
目录对换
1 | /123456/xxxx -> /xxxx?id=123456 |
例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:
1 | if ($http_user_agent ~ MSIE) { |
目录自动加“/”
1 | if (-d $request_filename){ |
禁止 ht access
1 | location ~/\.ht { |
禁止多个目录
1 | location ~ ^/(cron|templates)/ { |
禁止以/data开头的文件
可以禁止/data/下多级目录下.log.txt等请求;
1 | location ~ ^/data { |
禁止单个目录
不能禁止.log.txt能请求
1 | location /searchword/cron/ { |
禁止单个文件
1 | location ~ /data/sql/data.sql { |
给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志
1 | location ~(favicon.ico) { |
设定某个文件的过期时间;这里为600秒,并不记录访问日志
1 | location ^~ /html/scripts/loadhead_1.js { |
文件反盗链并设置过期时间
这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
“rewrite ^/ http://www.jbxue.com/leech.gif;”显示一张防盗链图片
“access_log off;”不记录访问日志,减轻压力
“expires 3d”所有文件3天的浏览器缓存
1 | location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { |
只充许固定ip访问网站,并加上密码
1 | root /opt/htdocs/www; |
将多级目录下的文件转成一个文件,增强seo效果
1 | /job-123-456-789.html 指向/job/123/456/789.html |
将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/
1 | rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last; |
上面例子有个问题是访问/shanghai 时将不会匹配
1 | rewrite ^/([0-9a-z]+)job$ /area/$1/ last; |
这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。
那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果
1 | if (-d $request_filename){ |
知道原因后就好办了,手动跳转:
1 | rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; |
文件和目录不存在的时候重定向:
1 | if (!-e $request_filename) { |
域名跳转
1 | server |
多域名转向
1 | server_name www.jbxue.com/ www.jbxue.com/; |
三级域名跳转
1 | if ($http_host ~* “^(.*)\.i\.c1gstudio\.com$”) { |
域名镜向
1 | server |
某个子目录作镜向
1 | location ^~ /zhaopinhui { |
给discuz某版块单独配置域名
1 | server_name bbs.c1gstudio.com news.c1gstudio.com; |
discuz ucenter 头像 rewrite 优化
1 | location ^~ /ucenter { |