热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Nginx服务器rewrite伪静态配置详解

Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用(当然并不是说不改动任何东西就拿来使用)。比如在Apache中这样写规则rewrite^/([0-9]{5}).html$/viewthread.php?tid$1last;而在Nginx中写成这样写是无法启动的,解决的办法是加
Nginx的Rewrite规则和Apache的Rewite规则差别不是很大,几乎可以直接使用(当然并不是说不改动任何东西就拿来使用)。
比如在Apache中这样写规则 rewrite ^/([0-9]{5}).html$ /viewthread.php?tid=$1 last; 而在Nginx中写成这样写是无法启动的,解决的办法是加上两个双引号: rewrite “^/([0-9]{5}).html$” /viewthread.php?tid=$1 last;一般来说,nginx的rewrite规则可以写在nginx配置文件中的location {}中,也可以针对特定的目录进行location \demo {},这个实例就是针对服务器根目录下的demo目录的rewrite规则配置等等; nginx的rewrite重写是基于pcre库匹配的,所以会牵涉到一些基本的nginx匹配规则:

nginx rewrite 正则表达式匹配

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

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

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

一些可用的全局变量
可以用在rewrite时的条件判断
$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.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; 
再来一个针对浏览器优化的自动rewrite,这里rewrite后的目录可以是存在的;
例如设定nginx在用户使用ie的使用重定向到/nginx-ie目录
规则如下:
 if ($http_user_agent ~ MSIE) {
     rewrite ^(.*)$ /nginx-ie/$1 break; 


目录自动加“/” ,这个功能一般浏览器自动完成
if (-d $request_filename){ 
rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent; 

以下这些可能就跟广义的rewrite重写无关了

禁止htaccess 
location ~/\.ht { 
    deny all; 


禁止多个目录 
location ~ ^/(cron|templates)/ { 
    deny all; break; 


禁止以/data开头的文件,可以禁止/data/下多级目录下.log.txt等请求
location ~ ^/data { 
    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; 
    expires 600; 
    break; 


文件反盗链并设置过期时间--<盗链多次请求也会打开你的站点的图片啊,所以设置下缓存时间,不会每次盗链都请求并下载这张图片>
location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ { 
    valid_referers none blocked *.server110.cn *.server110.com.cn *.lanwei.org *.server110.org localhost  42.121.107.189; 
    if ($invalid_referer) { 
        rewrite ^/ http://img.server110.cn/forbid.gif; 
        return 417; 
        break; 
    } 
    access_log off; 
    break; 

说明:
这里的return 417 为自定义的http状态码,默认为403,方便通过nginx的log文件找出正确的盗链的请求地址 
“rewrite ^/ http://img.server110.cn/forbid.gif;”显示一张防盗链图片
 “access_log off;”不记录访问日志,减轻压力 
“expires 3d”所有文件3天的浏览器缓存 

只充许固定ip访问网站,并加上密码;这个对有权限认证的应用比较在行
location \ { 
    allow 22.27.164.25; #允许的ipd
    deny all; 
    auth_basic “KEY”; #认证的一些设置
    auth_basic_user_file htpasswd; 
}
说明:location的应用也有各种变化,这里的写法就针对了根目录了。

文件和目录不存在的时重定向
if (!-e $request_filename) { 
    #proxy_pass http://127.0.0.1; #这里是跳转到代理ip,这个代理ip上有一个监听的web服务器
    rewrite ^/ http://www.server110.cn/none.html;  #跳转到这个网页去
    #return 404; #直接返回404码,然后会寻找root指定的404.html文件


域名跳转 
server { 
    listen 80; 
    server_name jump.server110.cn ;#需要跳转的多级域名
    index index.html index.htm index.php; #入口索引文件的名字
    root /var/www/public_html/; #这个站点的根目录
    rewrite ^/ http://www.server110.cn/; 
    #rewrite到这个地址,功能表现:在浏览器上输入jump.server110.cn并回车,不会有任何提示直接变成www.server110.cn
    access_log off; 


多域名转向 
server { 
    listen 80; 
    server_name www.server110.cn www.server110.org;
    index index.html index.htm index.php; 
    root /var/www/public_html/; 
    if ($host ~ “server110\.org”) { 
        rewrite ^(.*) http://www.server110.cn$1 permanent; 
    } 
}

三级域名跳转 
if ($http_host ~* “^(.*)\.i\.server110\.cn$”) { 
    rewrite ^(.*) http://demo.server110.cn$1; 
    break; 


域名镜向 
server { 
    listen 80; 
    server_name mirror.server110.cn; 
    index index.html index.htm index.php; 
    root /var/www/public_html; 
    rewrite ^/(.*) http://www.server110.cn/$1 last; 
    access_log off; 


某个子目录作镜向,这里的示例是demo子目录
location ^~ /demo { 
    rewrite ^.+ http://demo.server110.cn/ last; 
    break; 
}
以下在附带本博客的rewrite写法,emlog系统的rewrite
location ~ {
    if (!-e $request_filename) {
           rewrite ^/(.+)$ /index.php last;
    }
}

推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • 目录浏览漏洞与目录遍历漏洞的危害及修复方法
    本文讨论了目录浏览漏洞与目录遍历漏洞的危害,包括网站结构暴露、隐秘文件访问等。同时介绍了检测方法,如使用漏洞扫描器和搜索关键词。最后提供了针对常见中间件的修复方式,包括关闭目录浏览功能。对于保护网站安全具有一定的参考价值。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了通过ABAP开发往外网发邮件的需求,并提供了配置和代码整理的资料。其中包括了配置SAP邮件服务器的步骤和ABAP写发送邮件代码的过程。通过RZ10配置参数和icm/server_port_1的设定,可以实现向Sap User和外部邮件发送邮件的功能。希望对需要的开发人员有帮助。摘要长度:184字。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • CentOS 7部署KVM虚拟化环境之一架构介绍
    本文介绍了CentOS 7部署KVM虚拟化环境的架构,详细解释了虚拟化技术的概念和原理,包括全虚拟化和半虚拟化。同时介绍了虚拟机的概念和虚拟化软件的作用。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
author-avatar
xiubao
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有