设为首页 收藏本站
查看: 681|回复: 0

[经验分享] 关于nginx的rewrite重写规则

[复制链接]

尚未签到

发表于 2016-12-26 11:29:04 | 显示全部楼层 |阅读模式
  今天搞https接入的时候,nginx这边进行https的认证加解密功能,所以后端的nginx和apache都是不需要进行什么变化的,业务也是如此,但是有一个业务稍微有点不同,其需要根据http接入和https接入的不同来做吐出不同的东东,由于nginx这一层接入来做的ssl相关的东东,到了后端的apache这里已经是http的了(这样做的目的是为了省事和性能考虑)。这是cgi并不知道转发过来的是http的请求还是https的请求。
  于是就需要在前端接入nginx这里做一些调整,使得到后端的时候能够判断是否是https的。
  想到的一个简单的方法就是通过rewrite规则,将请求的参数后面增加一个特殊的参数用于表示这是https的请求。
  于是配置转发的规则,在location里面配置了怎么也不行,于是只能在server里面通过if判断来进行配置了。
  if ( $request_uri ~* ^\/***\/ ) {
rewrite  ^(.+)$  $1?***https=1  last;
}
  问题得到了解决,到后端apache的请求都会带上一个特殊的***https的请求参数啦,从而方便了后端的程序来进行判断。
  呵呵,当然也可以通过配置其它的虚拟主机的方式来实现,不过这样的话,就要拷贝一份程序的代码,为https写一份差不多相同的代码,实在麻烦。
  在使用nginx的rewrite的时候,开始加上了$query_string 发现到了后端的参数是double了的,查阅了一下发现:
rewrite
  语法:rewrite regex replacement flag
  默认:none
  作用域:server, location, if
  This directive changes URI in accordance with the regular  expressionand the replacement string. Directives are carried out in  order of appearance in the configuration file.
  这个指令根据表达式来更改URI,或者修改字符串。指令根据配置文件中的顺序来执行。
  Be aware that the rewrite regex only matches the relative path  instead of the absolute URL. If you want to match the hostname, you  should use an if condition, like so:
  注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。
  呵呵,rewrite只是会改写路径部分的东东,不会改动用户的输入参数,因此这里的if规则里面,你无需关心用户在浏览器里输入的参数,rewrite后会自动添加的因此,我们只是加上了一个?号和后面我们想要的一个小小的参数***https=1就可以了。
  nginx的rewrite规则参考:

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


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


  • 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;
  • }

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-319680-1-1.html 上篇帖子: 【原创】OpenResty Lua 中使用 Nginx 正则表达式 下篇帖子: 使用 Lua 编写一个 Nginx 认证模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表