Nginx的伪静态配置中使用rewrite来实现自动补全的实例
nginx+php使用的时候经常需要伪静态,一般大家都手动设置。那有没有办法让nginx自动补全路径呢?
这两天折腾很久,才实现了这样一个功能:
请求/a/b/c
若文件不存在,查找/a/b/index.php,/c作为PATH_INFO;
若文件不存在,查找/a/index.php,/b/c作为PATH_INFO;
若文件不存在,查找/index.php,/a/b/c作为PATH_INFO;
若文件不存在,返回404.
虽然这种损耗性能的行为不适合部署,但在本机调试的时候还是能够带来方便的:)
server端应有如下代码,其他部分使用自己的配置:
indexindex.phpindex.htmlindex.htm; location/{ set$path$request_uri; set$path_info""; try_files$uri$uri/@404; } location@404{ if($path~^(.*)(/.+)$){ set$path$1/index.php; set$path_info$2; rewrite.*$pathlast; } return404; } location~.+.php($|/){ fastcgi_split_path_info^(.+.php)(/.+)$; if($path_info!~.*){ set$path_info$fastcgi_path_info; } try_files$fastcgi_script_name@404php; fastcgi_paramPATH_INFO$path_info; fastcgi_indexindex.php; includefastcgi.conf; fastcgi_passunix:/usr/local/var/run/php-fpm.sock; fastcgi_connect_timeout60; fastcgi_send_timeout300; fastcgi_read_timeout300; } location@404php{ if($path=/index.php){ return404; } if($path~^(.*)(/.+)/index.php$){ set$path_info$2; set$path$1/index.php; rewrite.*$pathlast; } return404; }
Rewrite的Flags
last-基本上都用这个Flag。
break-中止Rewirte,不在继续匹配
redirect-返回临时重定向的HTTP状态302
permanent-返回永久重定向的HTTP状态301
规则:
一般在非根的location中配置rewrite,都是用的break;而根的location使用last比较好,因为如果配置了fastcgi或代理访问jsp文件的话,在根location下用break是访问不到
正则表达式形式的模式匹配,如~*和~
- ‘~'表示大小写敏感的匹配
- ‘~*'表示大小写不敏感的匹配(例如:“firefox”字符串可以成功匹配“FireFox”)
- !~和!~*代表跟后面的正则匹配规则相反的规则,表示不能匹配当前正则表达式规则的字符串执行后面的处理语句
- 使用-f参数以及!-f参数检测一个文件是否存在
- 使用-d参数以及!-d参数检测一个目录(路径)是否存在
- 使用-e以及!-e检测是否存在一个文件,一个目录或者一个符号链接。
- 使用-x以及!-x检测一个文件是否可执行
- 正则表达式部分可以嵌套,表达式后面的部分如果用到前面的表达式可以用$1到$9变量表示。