
本文目录:
1.1 URL重写简介
1.2如果有说明
1.3重写命令
1.4 URL重写和反向代理之间的区别
URL重写是由ngx_http_rewrite_module模块提供的,该模块将默认安装,但是实现此模块的功能需要pcre. URL重写技术不仅需要掌握多条指令的语法并熟悉简单的正则表达式,而且还需要尽可能地熟悉nginx的每个变量的含义. 越熟悉的变量越好. 您需要使用的大多数变量由http_core模块提供. 有关其含义,请参见官方手册http_core内置变量.
重写模块主要有5条指令: 中断,返回,设置,重写以及是否.
if不支持嵌套,并且不支持“ &&”和“ ||”多用途运营商. 语法为:
if (condition) {}
测试条件可以定义如下:
(1). 变量比较可以使用“ =”和“!=“运算符.
(2). 常规匹配可以使用“〜”和“〜*”,前者表示区分大小写的常规匹配,而后者则表示不区分大小写的匹配.

(3). 常规匹配之前可以带有感叹号“!〜”和“!〜*”表示倒置nginx开启rewrite模块,即不匹配.
(4). “ -f”和“!-f”确定文件是否存在.
(5). “ -d”和“!-d”确定目录是否存在.
(6). “ -e”和“!-e”确定是否存在文件,目录或软链接.
(7). “ -x”和“!-x”确定文件是否可执行.
如果支持正则表达式,则可以使用$ 1到$ 9来实现反向引用.
以下是一些示例:
# 当使用IE浏览器访问时,重定向到/msie/目录下的对应文件
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /msie/$1 break;
}
# 当http请求的方法为POST,则直接返回405状态码,即Method not Allowed
if ($request_method = POST) {
return 405;
}
# 当请求的资源文件不存在,则直接退出当前匹配,并代理至本机,这种情况下由本机来提供服务,如提供错误页面
if (!-f $request_filename) {
break;
proxy_pass http://127.0.0.1;
}
# 当访问的是linuxidc.com下任意主机,则重定向到www.linuxidc.com主机下的对应目录
if ($http_host ~* "^(.*)\.linuxidc\.com$") {
set $domain $1;
rewrite ^(.*) http://www.linuxidc.com/$domain/ break;
}
上面的最后一个URL重写之后的URL是一个新的主机名站点,但是使用URL重写的效率相对较低. 最好直接为此站点直接定义虚拟主机. 改写为:
server {
listen 80;
server_name .linuxidc.com;
return 302 http://www.linuxidc.com/$request_uri;
}
server {
listen 80;
server_name www.linuxidc.com;
}
可以在服务器部分,位置部分和if部分中写入
rewrite. 语法:

rewrite regexp replacement [flag]
如果替换部分以“ http: //”或“ https: //”或“ $ schema”开头,则直接进行临时重定向,请参见下表中的重定向标记.
flag是一个标志. 标记共有4种,其功能如下.
标志说明
最后
停止在当前上下文中处理其他重写模块指令,并再次为重写的uri执行上下文匹配
休息
像break指令一样,它将在当前上下文中停止处理其他重写模块指令
重定向
返回到临时重定向状态码302. 当替换部分的名称不是以“ http: //”,“ https: //”或“ $ schema”开头时,“ $ schema”变量将指示使用哪个协议用过
永久
返回永久重定向状态代码301

在上面的标志中,last和break用于实现URL重写. 此时,浏览器中的地址不会更改,但是实际上在服务器上访问的资源和路径已更改. 重定向和永久用于实现URL重定向,浏览器中的地址将更改为重定向的地址.
使用proxy_pass命令时,请使用break标签. 执行此重写规则后,最后一个标记将继续在当前上下文中发起对已重写地址的匹配请求,并且中断将在此匹配完成后再次停止匹配. 例如,以下两个重写规则.
rewrite "^/bbs/(.*)/images/(.*)\.jpg$" www.linuxidc.com/bbs/$2/images/$1.jpg last;
rewrite "^/bbs/(.*)/images/(.*)\.jpg$" www.linuxidc.com/bbs/$2/images/$1.jpg break;
如果正在访问它,它将被重写nginx开启rewrite模块,但是如果您使用以下位置的最后一个标记,则重写的地址仍可以匹配规则^ / bbs /(.*)/ images /(. *)\. jpg $这次,它将再次重写,最终导致URL重写周期,nginx默认支持10个周期,然后返回500个状态码. 但是,如果使用了中断标记,则重写将在完成重写后不再匹配.
例如,以下重写示例会将linuxidc.com结尾的所有访问重定向到.
server_name www.linuxidc.com;
rewrite (.*).linuxidc.com www.linuxidc.com permanent;
以下重写示例将把*的访问重定向到*.
server {
listen 80;
server_name www.linuxidc.com;
location /{
root /www/linuxidc/;
index index.html;
rewrite "/bbs/(.*)" "/forum/$1" last;
}
}
URL重写和反向代理可以将请求转发到其他主机. 但是它们有很大的不同.
1. URL重写可以实现反向代理无法实现的某些转发.
2. URL重写可以更改浏览器地址.
3. 反向代理与上游更多地协作以实现负载平衡. URL重写无法通过转发直接实现负载平衡.

4. 还有许多其他差异. 您无需关心它们之间的差异. 如果可以通过URL重写或反向代理来实现特定要求,则只需使用一种方法.
您可能还喜欢下面有关Nginx的文章,您可能希望参考它:
Nginx 403禁止溶液
在CentOS 7下安装和配置Nginx服务器
在CentOS上安装Nginx服务器以实现虚拟主机和域名重定向
CentOS 6.8安装LNMP环境(Linux + Nginx + MySQL + PHP)
在Linux下安装PHP环境并配置Nginx以支持php-fpm模块
Nginx服务的SSL身份验证和htpasswd身份验证
在Ubuntu 16.04上加密且安全的Nginx Web服务器
在Linux中详细安装和配置Nginx以及参数
使用ngx_log_if进行Nginx日志过滤不会记录特定日志
在CentOS 7.2下安装和配置Nginx + PHP + MySQL + Memcache缓存服务器
CentOS6.9编译并安装Nginx1.4.7
Nginx详细介绍: 请单击此处
Nginx下载地址: 请单击此处
本文将永久更新链接地址:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/shumachanpin/article-284186-1.html
看起来是还可以的说
奥巴马万岁