2014-03-12 12:29:02
来 源
ITJS.CN
Nginx
本文介绍Nginx服务器如何配置rewrite伪静态,希望对于初学Nginx服务器相关的朋友有帮助,更多Nginx安装、配置、报错处理等资源请本站内搜索。。
之前网站用的是jsp的网页,后来又改成用apache + php的,为了防止搜索过来原来老的jsp路径都可以访问就在apache上做了rewrite,现在apache无法承受压力,将apache改成 nginx,遇到的问题就是如何将apache的rewrite改成nginx的语法实现。

通过在google上的搜索总结几点如下,因为要实现我们网站的rewrite很麻烦所以折腾了很久。

一、伪装动态的地址为静态地址

这种是最常用和最简单的,所谓的动态地址即带有参数的URL

如:真实访问地址是http://www.test.com/a.php?b=test 但想通过rewrite实现地址的静态化,方便用户访问想改为http://www.test.com/test.html

Apache:

RewriteEngine On

RewriteRule /test.html /a.php?b=test [L]

Nginx:

rewrite “/test.html” /a.php?b=test last

其实nginx的rewrite比apache更简单了,至少要写的东西少些,另外注意1、Nginx伪装地址需要双引号

2、真实地址不需要 来转义

3、[L] 改为last

4 、Apache可以放到.htaccess中,nginx不行

二、复杂的地址伪装

这个其实跟上还是一样的、只是运用复杂的正则表达式和通用的变量来完成使rewrite规则一条就适应所有的。

三、带参数的地址伪装

rewrite都有一个特点,不管是apache还是nginx,就是用上面的方法rewrite规则的伪装的地址上不能传递参数,会把?当成与此同时表达式。当然肯定是有解决的办法,我们的网站就是面临这种问题

如:想让用户输入http://www.test.com/a.jsp?Model=3500c 而访问http://www.test.com/b.php?id=10

这个转换是即没有规律又要传递参数的

Apache:

RewriteEngine On

RewriteCond %{QUERY_STRING} ^Model=3500c$

RewriteRule ^a.jsp$ b.php?id=10 [L]

Nginx:

if ( $query_string = “Model=3500c” ){

rewrite ^ /b.php?id=10 last;

}

像这种传递参数的只能用rewrite的变量和if语句来做,相对来说nginx还是比较简单的,如果想实现更多的功能查看下面的nginx rewrite参数,通过组合肯定可以都实现。

nginx rewrtie参数

正则表达式匹配,其中:

* ~ 为区分大小写匹配

* ~* 为不区分大小写匹配

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

文件及目录匹配,其中:

* -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

声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。