nginx rewrite参数详解
2009-07-26 22:08
正则表达式匹配,其中: * ~ 为区分大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: * -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 举例: abc.domian/sort/2 => abc.domian/index.php?act=sort&name=abc&id=2 if ($host ~* (.*)\.domain\) { set $sub_name $1; rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last; } 测试可惜不能用else,另外,也不知如何测试重定向的部分条件打印输出。 只能通过重新生效配置之后查看效果才能知道ok与否。唉,菜鸟献上,大虾指点 续: 结合QeePHP的例子 1. if (!-d $request_filename) { 2. rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ 3. /index.php?namespace=user&controller=$1&action=$2&$3 4. last; 5. rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 6. last; 7. break; 多目录转成参数 abc.domian/sort/2 => abc.domian/index.php?act=sort&name=abc&id=2 1. if ($host ~* (.*)\.domain\) { 2. set $sub_name $1; 3. rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 4. last; 5. } 目录对换 /123456/xxxx -> /xxxx?id=123456 1. rewrite ^/(\d+)/(.+)/ /$2?id=$1 last; 例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下: 1. if ($http_user_agent ~ MSIE) { 2. rewrite ^(.*)$ /nginx-ie/$1 break; 3. } 目录自动加“/” 1. if (-d $request_filename){ 2. rewrite ^/(.*)([^/])$ $host/$1$2/ permanent; 3. } 禁止htaccess 1. location ~/\.ht { 2. deny all; 3. } 禁止多个目录 1. location ~ ^/(cron|templates)/ { 2. deny all; 3. break; 4. } 禁止以/data开头的文件 可以禁止/data/下多级目录下.等请求; 1. location ~ ^/data { 2. deny all; 3. } 禁止单个目录 不能禁止.能请求 1. location /searchword/cron/ { 2. deny all; 3. } 禁止单个文件 1. location ~ /data/sql/data.sql { 2. deny all; 3. } 给favicon.ico和设置过期时间; 这里为favicon.ico为99天,为7天并不记录404错误日志 1. location ~(favicon.ico) { 2. log_not_found off; 3. expires 99d; 4. break; 5. } 6. 7. location ~() { 8. log_not_found off; 9. expires 7d; 10. break; 11. } 设定某个文件的过期时间;这里为600秒,并不记录访问日志 1. location ^~ /html/scripts/loadhead_1.js { 2. access_log off; 3. root /opt/lampp/htdocs/web; 4. expires 600; 5. break; 6. } 文件反盗链并设置过期时间 这里的return 412 为自定义的http状态码,默认为403,方便出正确的盗链的请求 “rewrite ^/ leech.c1gstudio/leech.gif;”显示一张防盗链图片 “access_log off;”不记录访问日志,减轻压力 “expires 3d”所有文件3天的浏览器缓存 1. location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 2. valid_referers none blocked *.c1gstudio *.c1gstudio localhost 3. 208.97.167.194; 4. if ($invalid_referer) { 5. rewrite ^/ leech.c1gstudio/leech.gif; 6. return 412; 7. break; 8. } 9. access_log off; 10. root /opt/lampp/htdocs/web; 11. expires 3d; 12. break; 13. 正则匹配 链接 无域名的链接} 只充许固定ip访问网站,并加上密码 1. root /opt/htdocs/www; 2. allow 208.97.167.194; 3. allow 222.33.1.2; 4. allow 231.152.49.4; 5. deny all; 6. auth_basic "C1G_ADMIN"; 7. auth_basic_user_file htpasswd; 将多级目录下的文件转成一个文件,增强seo效果 /job-123-456-789.html 指向/job/123/456/789.html 1. rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ 2. /job/$1/$2/jobshow_$3.html last; 将根目录下某个文件夹指向2级目录 如/shanghaijob/ 指向 /area/shanghai/ 如果你将last改成permanent,那么浏览器地址栏显是/location/shanghai/ 1. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 2. last; 上面例子有个问题是访问/shanghai 时将不会匹配 1. rewrite ^/([0-9a-z]+)job$ /area/$1/ last; 2. 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不是的,所以没有效果 1. if (-d $request_filename){ 2. rewrite ^/(.*)([^/])$ $host/$1$2/ permanent; 3. } 知道原因后就好办了,让我手动跳转吧 1. rewrite ^/([0-9a-z]+)job$ /$1job/ permanent; 2. rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last; 文件和目录不存在的时候重定向: 1. if (!-e $request_filename) { 2. proxy_pass 127.0.0.1; 3. } 域名跳转 1. server 2. { 3. listen 80; 4. server_name jump.c1gstudio; 5. index index.html index.htm index.php; 6. root /opt/lampp/htdocs/www; 7. rewrite ^/ www.c1gstudio/; 8. access_log off; 9. } 三级域名跳转 1. if ($http_host ~* "^(.*)\.i\.c1gstudio\$") { 2. rewrite ^(.*) top.yingjiesheng$1; 3. break; 4. } 域名镜向 1. server 2. { 3. listen 80; 4. server_name mirror.c1gstudio; 5. index index.html index.htm index.php; 6. root /opt/lampp/htdocs/www; 7. rewrite ^/(.*) www.c1gstudio/$1 last; 8. access_log off; 9. } 某个子目录作镜向 1. location ^~ /zhaopinhui { 2. rewrite ^.+ zph.c1gstudio/ last; 3. break; 4. } discuz ucenter home (uchome) rewrite 1. rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 2. last; 3. rewrite ^/(space|network)\.html$ /$1.php last; 4. rewrite ^/([0-9]+)$ /space.php?uid=$1 last; discuz 7 rewrite 1. rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ 2. $1/archiver/index.php?$2 last; 3. rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ 4. $1/forumdisplay.php?fid=$2&page=$3 last; 5. rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ 6. $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 last; 7. rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last; 8. rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last; 9. rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last; |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论