0x01.About
之前写过Nginx重定向了,http://homeway.me/2014/10/28/nginx-reverse-proxy-conf/,但当时比较模糊。
这里主要说两种常用的重定向,都是php中的重定向。
一种是typecho的带 index.php
例如 http://homeway.me/index.php/arg1/arg2
,另一种是隐藏 index.php
的 http://homeway.me/arg1/arg2
。
以下配置代码均亲测可用。
0x02.ngx_http_rewrite_module
首先还是按常理,先脑补下nginx地rewrite规则,http://nginx.org/en/docs/http/ngx_http_rewrite_module.html
关于nginx重写的指令主要由这么一些:
1. break指令 2. if指令 3. return指令 4. rewrite指令 5. rewrite_log指令 6. set指令
break指令
停止执行当前虚拟主机的后续rewrite指令集if指令
对给定的条件condition进行判断。如果为真,大括号内的rewrite指令将被执行。
有几个要记住的操作符:
使用=,!= 比较的一个变量和字符串
是用~,~*与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用” 或’ 包围
使用-f,!-f 检查一个文件是否存在
使用-d,!-d 检查一个目录是否存在
使用-e,!-e 检查一个文件、目录、符号链接是否存在
使用-x,!-x 检查一个文件是否可执行
详细中文看这里好了: http://www.nginx.cn/216.html
0x03.nginx.conf
首先要明白我们现在要做的事情是两类, /index.php/arg1/arg2
和 /arg1/arg2
1.类typecho的 /index.php/arg1/arg2
/index.php/arg1/arg2
跑的location是index.php文件,也就是说,我们要做一个location匹配.php
的正则,并且要让它分辨出uri中的 /arg1/arg2
这个正则有很多种写法,我用的是lnmp传统的写法~ [^/]\.php(/|$)
。
完整匹配如下:
location ~ [^/]\.php(/|$)
{
#try_files $uri =404; 住址扫描目录用的,这里我们都是虚假目录,删除。
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
#include fastcgi_params;
}
我测了下,这样其实就搞定了,typecho重定向就好了,不要向网上说的3个if语句。
只要访问/index.php/arg1/arg2
就能访问到内容了。
这里有几个问题:
- fastcgi_split_path_info干嘛用的?
去查找官网文档吧, http://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_split_path_info
Defines a regular expression that captures a value for the fastcgipathinfovariable.Theregularexpressionshould