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/(.*)$ /site/$host/images/$1 last;      }

2. Nginx与Apache的Rewrite规则实例对比

    简单的Nginx和Apache 重写规则区别不大,基本上能够完全兼容。

 Apache Rewrite 规则:

 

 代码如下 复制代码

RewriteRule ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 [L]

RewriteRule ^/ceshi/$ /zl/ceshi.php [L]

RewriteRule ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 [L] RewriteRule ^/pingce([0-9]*)/$

/zl/pingce.php?id=$1 [L]

 

Nginx Rewrite 规则:

 

 代码如下 复制代码

rewrite ^/(mianshi|xianjing)/$ /zl/index.php?name=$1 last;

rewrite ^/ceshi/$ /zl/ceshi.php last;

rewrite ^/(mianshi)_([a-zA-Z]+)/$ /zl/index.php?name=$1_$2 last;

rewrite ^/pingce([0-9]*)/$ /zl/pingce.php?id=$1 last;

    不难发现Apache的Rewrite规则改为Nginx的Rewrite规则挺简单的,如果改完规则,使用"nginx -t"命令检查发现

nginx.conf配置文件有语法错误,那么可以尝试给条件加上引号。例如一下的Nginx Rewrite规则会报语法错误:

 

 代码如下 复制代码

rewrite  ^/([0-9]{5}).html$ /x.jsp?id=$1  last;加上引号就正确了:  

rewrite  “^/([0-9]{5}).html$” /x.jsp?id=$1  last;

 

Apache与Nginx的Rewrite规则在URL跳转时有细微的区别:

Apache Rewrite 规则:

 代码如下 复制代码

 

RewriteRule  ^/html/tagindex/([a-zA-Z]+)/.*$ /$1/ [R=301,L]
Nginx Rewrite 规则:

rewrite  ^/html/tagindex/([a-zA-Z]+)/.*$ http://$host/$1/  permanent;

以上示例中,我们注意到,Nginx Rewrite 规则的置换串中增加了“http://$host”,这是在Nginx中要求的。
   
另外,Apache与Nginx的Rewrite规则在变量名称方面也有区别,例如:
Apache Rewrite 规则:

 

 代码如下 复制代码
RewriteRule ^/user/login/$ /user/login.php?login=1&forward=http://%{HTTP_HOST}  [L]

   
Nginx Rewrite 规则:

rewrite  ^/user/login/$ /user/login.php?login=1&forward=http://$host  last;
Apache与Nginx Rewrite 规则的一些功能相同或类似的指令、标记对应关系:
Apache的RewriteCond指令对应Nginx的if指令;
Apache的RewriteRule指令对应Nginx的rewrite指令;
Apache的[R]标记对应Nginx的redirect标记;
Apache的[P]标记对应Nginx的last标记;
Apache的[R,L]标记对应Nginx的redirect标记;
Apache的[P,L]标记对应Nginx的last标记;
Apache的[PT,L]标记对应Nginx的last标记;

允许指定的域名访问本站,其他域名一律跳转到http://www.aaa.com:
 

Apache Rewrite 规则:

 

 代码如下 复制代码

RewriteCond %{HTTP_HOST}    ^(.*?).domain.com$

RewriteCond %{HTTP_HOST}    !^qita.domain.com$ RewriteCond %{DOCUMENT_ROOT}/market/%1/index.htm -f

RewriteRule ^/wu/$ /market/%1/index.htm [L]

   
Nginx的if指令不支持嵌套,也不支持AND、OR等多条件匹配,相比于Apache的RewriteCond,显得麻烦一些,但是,我

们可以通过下一页的Nginx配置写法来实现这个示例:
    Nginx Rewrite 规则:
 

 代码如下 复制代码

if ($host ~* ^(.*?).domain.com$)   

{

set $var_wupin_city $1;   

set $var_wupin 1';   

}   

 

if ($host ~* ^qita.domain.com$)

{

set $var_wupin 0';   

}   

 

if (!-f $document_root/market/$var_wupin_city/index.htm)   

{

set $var_wupin 0';   

}   

if($var_wupin ~ '1')   

{

rewrite ^/wu/$ /market/$var_wupin_city/index.htm last;   

}

时间: 2024-10-22 12:44:59

apache与nginx中的rewrite伪静态规则分析的相关文章

Nginx系列教程:常用PHP程序Rewrite(伪静态规则)

Rewrite主要的功能就是实现URL的重写,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用到rewrite模块,必须先安装或加载rewrite模块. Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx Rewrite规则语法如下: rewrite ^/b/(.*)\.html

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

本文中的内容收集整理自互联网,在nginx中使用rewrite模块的一些方法.参数及示例文件,供以后学习,特归纳出来供大家来参考. &http://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 正则表达式匹配,其中: * ~ 为区分 大小写匹配 * ~* 为不区分大小写匹配 * !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配,其中: * -f和!-f用来判断是否存在文件 * -d和!-d用来判断是否存在

Discuz与Ecshop最新的IIS Rewrite伪静态规则

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 我搞了2个小站一个论坛 一个网店 一直想同时实现伪静态,测试了很多次都没有成功.在网上找了很多Rewrite伪静态规则都不管用失败的主要是ecshop .最后求助admin5的汉三哥哥帮我从新写了一份规则:). 现在提供给大家,希望可以帮到更多和我一样情况的哥哥姐姐们. Discuz 的设置就不说了 官方有的,这里重点说下ecshop 请在后

WordPress中用于更新伪静态规则的PHP代码实例讲解_php实例

flush_rewrite_rules() 函数用来删除然后根据现有的条件重写伪静态规则,也就是刷新一次伪静态规则了. 先来说一下,通常在主题或者插件添加新的自定义文章类型的时候调用,防止新的自定义文章类型的文章出现 404 的情况,或者很多时候我们都需要在主题启用的时候执行一些代码,比如布置一些数据库表单.跳转到设置页面等等,WordPress 本身并没有提供相关的钩子,网上也有很多五花八门的实现方法,经过我的研究,发现了可能是最优的方法,下边分享给大家: /** *WordPress 在主题

http响应Last-Modified和ETag以及Apache和Nginx中的配置

 基础知识 1) 什么是"Last-Modified"? 在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样: Last-Modified: Fri, 12 May 2006 18:53:33 GMT 客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过: If-

【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中的中文配置文件解释可参考

在varnish、squid、apache、nginx中选出一个更好的缓存服务器_Linux

一.varnish.squid.apache.nginx的区别 1.从这些功能上.varnish和squid是专业的cache服务,而apache,nginx这些都是第三方模块完成. 2.要做cache服务的话,我们肯定是要选择专业的cache服务,优先选择squid和varnish. varnish本身的技术上优势要高于squid,它采用了"Visual Page Cache"技术,在内存的利用上,Varnish比Squid具有优势,它避免了Squid频繁在内存.磁盘中交换文件,性能

RHCE学习<6>Apache、Nginx详解和AWStats日志分析

一.Apache服务 Apache是Apache软件基金会的一个开放源码的网页服务器,是世界使用最广泛的Web服务端之一,译为阿帕奇:Apache具有优秀的性能,稳定性,是通过加载模块来提供各种功能. 1.主配置httpd.conf 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ServerRoot     #服务目录 ServerAdmin    #管理员邮箱 user           #运行服务的用户身份 group        

nginx中防止SQL注入规则(非常详细)

$request_uri This variable is equal to the *original* request URI as received from the client including the args. It cannot be modified. Look at $uri for the post-rewrite/altered URI. Does not include host name. Example: "/foo/bar.php?arg=baz" 这