nginx中使用rewrite模块的参数及示例

本文中的内容收集整理自互联网,在nginx中使用rewrite模块的一些方法、参数及示例文件,供以后学习,特归纳出来供大家来参考。
&">nbsp;

正则表达式匹配,其中:

* ~ 为区分
大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

文件及目录匹配,其中:

* -f和!-f用来判断是否存在文件 * -d和!-d用来判断是否存在目录 * -e和!-e用来判断是否存在文件或目录 * -x和!-x用来判断文件是否可执行

flag标记有:

* last 相当于Apache里的[L]标记,表示完成rewrite * break 终止匹配, 不再匹配后面的规则 * redirect 返回302临时重定向 地址栏会显示跳转后的地址 * permanent 返回301永久重定向 地址栏会显示跳转后的地址

一些可用的全局变量有,可以用做条件判断(待补全)

$args $content_length $content_type $document_root $document_uri $host $http_user_
agent $http_cookie $limit_rate $request_body_file $request_method $remote_addr $remote_port $remote_user $request_filename $request_uri $query_string $scheme $server_protocol $server_addr $server_name $server_port $uri

结合QeePHP的例子

if (!-d $request_filename) { rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last; rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last; break;

多目录转成参数
abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

if ($host ~* (.*)/.domain/.com) { set $sub_name $1;    rewrite ^/sort//(/d+)//?$ /index.php?act=sort&cid=$sub_name&id=$1 last; }

目录对换
/123456/xxxx -> /xxxx?id=123456

rewrite ^/(/d+)/(.+)/ /$2?id=$1 last;

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /nginx-ie/$1 break; }

目录自动加“/”

if (-d $request_filename){ rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; }

禁止htaccess

location ~//.ht {          deny all;      }

禁止多个目录

location ~ ^/(cron|templates)/ {          deny all; break;      }

禁止以/data开头的文件
可以禁止/data/下多级目录下.log.txt等请求;

location ~ ^/data {          deny all;      }

禁止单个目录
不能禁止.log.txt能请求

location /searchword/cron/ {          deny all;      }

禁止单个文件

location ~ /data/sql/data.sql {          deny all;      }

给favicon.ico和robots.txt设置过期时间;
这里为favicon.ico为99天,robots.txt为7天并不记录404错误日志

location ~(favicon.ico) {                  log_not_found off; expires 99d; break;      }        location ~(robots.txt) {                  log_not_found off; expires 7d; break;      }

设定某个文件的过期时间;这里为600秒,并不记录访问日志

location ^~ /html/scripts/loadhead_1.js {                  access_log   off;                  root /opt/lampp/htdocs/web; expires 600; break;        }

文件反盗链并设置过期时间
这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求
“rewrite ^/ http://leech.c1gstudio.com/leech.gif;”显示一张防盗链图片
“access_log off;”不记录访问日志,减轻压力
“expires 3d”所有文件3天的浏览器缓存

location ~* ^.+/.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { valid_referers none blocked *.c1gstudio.com *.c1gstudio.net localhost 208.97.167.194; if ($invalid_referer) {     rewrite ^/ http://leech.c1gstudio.com/leech.gif;     return 412;     break; }                  access_log   off;                  root /opt/lampp/htdocs/web; expires 3d; break;      }

只充许固定ip访问网站,并加上密码

root  /opt/htdocs/www; allow   208.97.167.194; allow   222.33.1.2; allow   231.152.49.4; deny    all; auth_basic "C1G_ADMIN"; auth_basic_user_file htpasswd;

将多级目录下的文件转成一个文件,增强seo效果
/job-123-456-789.html 指向/job/123/456/789.html

rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)/.html$ /job/$1/$2/jobshow_$3.html last;

将根目录下某个文件夹指向2级目录
如/shanghaijob/ 指向 /area/shanghai/
如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

上面例子有个问题是访问/shanghai 时将不会匹配

rewrite ^/([0-9a-z]+)job$ /area/$1/ last; rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,
如./list_1.html真实地址是/area/shanghia/list_1.html会变成/list_1.html,导至无法访问。

那我加上自动跳转也是不行咯
(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

if (-d $request_filename){ rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; }

知道原因后就好办了,让我手动跳转吧

rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

文件和目录不存在的时候重定向:

if (!-e $request_filename) { proxy_pass http://127.0.0.1; }

域名跳转

server      {              listen       80;              server_name  jump.c1gstudio.com;              index index.html index.htm index.php;              root  /opt/lampp/htdocs/www;              rewrite ^/ http://www.c1gstudio.com/;              access_log  off;      }

多域名转向

server_name  www.c1gstudio.com www.c1gstudio.net;              index index.html index.htm index.php;              root  /opt/lampp/htdocs; if ($host ~ "c1gstudio/.net") { rewrite ^(.*) http://www.c1gstudio.com$1 permanent; }

三级域名跳转

if ($http_host ~* "^(.*)/.i/.c1gstudio/.com$") { rewrite ^(.*) http://top.
yingjiesheng.com$1; break; }

域名镜向

server      {              listen       80;              server_name  mirror.c1gstudio.com;              index index.html index.htm index.php;              root  /opt/lampp/htdocs/www;              rewrite ^/(.*) http://www.c1gstudio.com/$1 last;              access_log  off;      }

某个子目录作镜向

location ^~ /zhaopinhui {   rewrite ^.+ http://zph.c1gstudio.com/ last;   break;      }

discuz ucenter home (uchome) rewrite

rewrite ^/(space|network)-(.+)/.html$ /$1.php?rewrite=$2 last; rewrite ^/(space|network)/.html$ /$1.php last; rewrite ^/([0-9]+)$ /space.php?uid=$1 last;

discuz 7 rewrite

rewrite ^(.*)/archiver/((fid|tid)-[/w/-]+/.html)$ $1/archiver/index.php?$2 last; rewrite ^(.*)/forum-([0-9]+)-([0-9]+)/.html$ $1/forumdisplay.php?fid=$2&page=$3 last; rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)/.html$ $1/viewthread.php?tid=$2&extra=page/%3D$4&page=$3 last; rewrite ^(.*)/profile-(username|uid)-(.+)/.html$ $1/viewpro.php?$2=$3 last; rewrite ^(.*)/space-(username|uid)-(.+)/.html$ $1/space.php?$2=$3 last; rewrite ^(.*)/tag-(.+)/.html$ $1/tag.php?name=$2 last;

给discuz某版块单独配置域名

server_name  bbs.c1gstudio.com news.c1gstudio.com;        location = / {         if ($http_host ~ news/.c1gstudio.com$) {   rewrite ^.+ http://news.c1gstudio.com/forum-831-1.html last;   break; }      }

discuz ucenter 头像 rewrite 优化

location ^~ /ucenter {      location ~ .*/.php?$      {   #fastcgi_pass  unix:/tmp/php-cgi.sock;   fastcgi_pass  127.0.0.1:
9000;   fastcgi_index index.php;   include fcgi.conf;           }        location /ucenter/data/avatar { log_not_found off; access_log   off; location ~ /(.*)_big/.jpg$ {     error_page 404 /ucenter/images/noavatar_big.gif; } location ~ /(.*)_middle/.jpg$ {     error_page 404 /ucenter/images/noavatar_middle.gif; } location ~ /(.*)_small/.jpg$ {     error_page 404 /ucenter/images/noavatar_small.gif; } expires 300; break;      }                        }

jspace rewrite

location ~ .*/.php?$              {                   #fastcgi_pass  unix:/tmp/php-cgi.sock;                   fastcgi_pass  127.0.0.1:9000;                   fastcgi_index index.php;                   include fcgi.conf;                   }                location ~* ^/index.php/              {     rewrite ^/index.php/(.*) /index.php?$1 break;                   fastcgi_pass  127.0.0.1:9000;                   fastcgi_index index.php;                   include fcgi.conf;              }

这些规则大家可以自己多研究一下,多中会获益很多,希望在实际的生产环境中能帮助到大家解决实际的问题,如果您有关于nginx使用经验方面的分享,欢迎登陆风信网进行投稿。

时间: 2024-07-30 03:04:26

nginx中使用rewrite模块的参数及示例的相关文章

解析Nginx中的日志模块及日志基本的初始化和过滤配置_nginx

无论在任何项目中,日志都是一个非常重要的模块,无论是问题定位还是日常信息的管理,都离不开他 在nginx中,ngx_errlog_module模块专门用于处理nginx日志信息,是nginx的core模块之一 在 main 函数中,时间初始化结束后马上进行的就是日志模块的初始化 日志结构: 日志模块的初始化主要做的事情就是初始化全局变量 ngx_log,并创建 errlog 文件 ngx_log_s 结构ngx_log 变量是一个 ngx_log_s 结构体,定义在 core/ngx_log.h

【Nginx】nginx中重写rewrite的语法错误[emerg] unknown directive

原来nginx语法检测特别严格,if和后面括号以及变量等号这些元素都要有空格,所以正确的写法是:   C/C++ Code复制内容到剪贴板 if ( $host != 'www.itokit.com' ){   rewrite ^(.*)$ http://www.itokit.com$1 permanent;   }       用^代替空格看起来更清晰:   if^(^$host^!=^'www.itokit.com'^){   反正多打几个空格就是了,所以nginx中的中文配置文件解释可参考

详解Nginx中的geo模块与利用其配置负载均衡的示例_nginx

geo指令使用ngx_http_geo_module模块提供的.默认情况下,nginx有加载这个模块,除非人为的 --without-http_geo_module. ngx_http_geo_module模块可以用来创建变量,其值依赖于客户端IP地址.geo指令语法: geo [$address] $variable { ... } 默认值: - 配置段: http 定义从指定的变量获取客户端的IP地址.默认情况下,nginx从$remote_addr变量取得客户端IP地址,但也可以从其他变量

apache与nginx中的rewrite伪静态规则分析

1. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的 Nginx Rewrite规则语法如下:    代码如下 复制代码 rewrite ^/b/(.*).html /play.php?video=$1 break;   如果加上if语句,示例如下:  代码如下 复制代码 if (!-f $request_filename) { rewrite ^/img/(.

nginx中使用nginx-http-concat模块合并静态资源文件_nginx

首先了解一下 nginx-http-concat,他是一个淘宝的开源Nginx模块,是一个能把多个CSS和JS合并成一个请求的Nginx模块,对于Web性能优化非常有意义. Github地址:https://github.com/alibaba/nginx-http-concat, 先看看淘宝用起来是什么样的,访问淘宝网主页,查看源代码可以看到类似的这样的style/script链接 复制代码 代码如下: <link rel="stylesheet" href="//g

Python中使用dom模块生成XML文件示例_python

在Python中解析XML文件也有Dom和Sax两种方式,这里先介绍如何是使用Dom解析XML,这一篇文章是Dom生成XML文件,下一篇文章再继续介绍Dom解析XML文件. 在生成XML文件中,我们主要使用下面的方法来完成. 主要方法 1.生成XML节点(node) 复制代码 代码如下: createElement("node_name") 2.给节点添加属性值(Attribute) 复制代码 代码如下: node.setAttribute("att_name",

Nginx中 Rewrite规则的学习笔记

路由重写是Web服务器中的一个很重要的基本功能.通过路由重写,可以结构化URL,更具语义化(对SEO有益).另外,分享出去的URL可能会因程序路由变动而导致URL失效,而路由的重写可以很好的解决这类问题. 适当的使用Rewrite功能,可以更我们带来很多的好处.Nginx中Rewrite的功能是基于perl语言兼容的正则表达式,所以在编译安装nginx之前,需要安装PREC库.Nginx中Rewrite功能实现是基于ngx_http_rewrite_module,所以确保安装了此模块. Rewr

ASP.NET中的HTTP模块和处理程序

asp.net|程序 介绍 在Internet时代的开端,客户端的需求非常有限:.htm文件就可以满足他们的需求.但是,随着时间的流逝,客户端需求的扩充超越了.htm文件或静态文件所包含的功能. 开发者需要扩充或扩展Web服务器的功能.Web服务器厂商设计了不同的解决方案,但是都遵循同一个主题"向Web服务器插入某些组件".所有的Web服务器补充技术都允许开发者建立并插入组件以增强Web服务器的功能.微软公司提出了ISAPI(Internet服务器API),网景公司提出了NSAPI(网

在Nginx中配置image filter模块来实现动态生成缩略图_nginx

先来看一下什么是nginx的image filter模块. HttpImageFilterModule用来裁剪过大的图片到指定大小,是nginx自带模块,默认不会开启 开启HttpImageFilterModule需要在编译要带上参数 --with-http_image_filter_module 该模块主要有两个指令: 语法: image_filter (test | size | resize width height | crop width height) 默认是: 无 可出现的上下文: