Nginx 伪静态
介绍
Nginx 伪静态,我们一般使用 rewrite 来实现,通过 Nginx 提供的变量或自己设置的变量,配合正则与标志位来进行 URL 重写。
标志位
- last:标志完成
- break:停止后续 rewrite
- redirect:302临时重定向
- permanent:301 永久重定向
if 指令
一般用法
if(condition) {
statement
}
表示如果条件为真,则执行语句,其中,条件可以是一个变量或表达式。当为一个变量时,值为空或任何以 0 开头的字符串时,则都为 false,表达式可以直接使用 =
或 !=
来比较变量或内容,~
正则匹配,~*
匹配不区分大小写,!~
匹配区分大小写。
- -f/!-f:判断文件是否存在
- -d/!-d:判断目录是否存在
- -e/!-e:判断文件或目录是否存在
- -x/!-x:判断文件是否可以执行
全局变量
- $args:请求中的参数
- $content_length:请求 HEAD 中的 Content-length
- $content_type:请求 HEAD 中的 Content_type
- $document_root:当前请求中 root 的值
- $host:主机头
- $http_user_agent:客户端 agent
- $http_cookie:客户端 cookie
- $limit_rate:限制连接速率
- $request_method:客户端请求方式,GET/POST
- $remote_addr:客户端 IP
- $remote_port:客户端端口
- $remote_user:验证的用户名
- $request_filename:请求的文件绝对路径
- $scheme:http/http
- $server_protocol:协议,HTTP/1.0 OR HTTP/1.1
- $server_addr:服务器地址
- $server_name:服务器名称
- $server_port:服务器端口
- $request_uri:包含请求参数的 URI
- $uri:不带请求参数的 URI
- $document_uri:同 $uri
示例:http://localhost:8080/name1/name2/name.php?args=n
$host: localhost
$server_port: 8080
$request_uri: /name1/name2/name.php?args=n
$document_uri: /name1/name2/name.php
$document_root: /var/www/localhost
$request_filename: /var/www/localhost/name1/name2/name.php
正则
- .:匹配任意字符,换行符除外
- ?:重复 1 次或 0 次
- +:重复 1 次或更多
- *:重复 0 次或更多
- \d:匹配数字
- ^:匹配字符串开头
- $:匹配字符串结尾
- {n}:重复 n 次
- {n,}:重复次数大于等于 n
- [n]:匹配单个字符n
- [a-z]:匹配 a-z 任意一个小写字母
$1
,$2
… $n
表示匹配表达式中的第一,第二 … 第 N 个括号中内容
示例
wordpress
location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}
joomla
location / {
if ( $args ~ "mosConfig_[a-zA-Z_]{1,21}(=|\%3d)" ) {
set $args "";
rewrite ^.*$ http://$host/index.php last;
return 403;}
if ( $args ~ "base64_encode.*\(.*\)") {
set $args "";
rewrite ^.*$ http://$host/index.php last;
return 403;}
if ( $args ~ "(\<|%3C).*script.*(\>|%3E)") {
set $args "";
rewrite ^.*$ http://$host/index.php last;
return 403;}
if ( $args ~ "GLOBALS(=|\[|\%[0-9A-Z]{0,2})") {
set $args "";
rewrite ^.*$ http://$host/index.php last;
return 403;}
if ( $args ~ "_REQUEST(=|\[|\%[0-9A-Z]{0,2})") {
set $args "";
rewrite ^.*$ http://$host/index.php last;
return 403;}
if (!-e $request_filename) {
rewrite (/|\.php|\.html|\.htm|\.feed|\.pdf|\.raw|/[^.]*)$ /index.php last;
break;}
}
uchome
location / {
rewrite ^/(space|network)\-(.+)\.html$ /$1.php?rewrite=$2 last;
rewrite ^/(space|network)\.html$ /$1.php last;
rewrite ^/([0-9]+)$ /space.php?uid=$1 last;
}