Apache .htaccess 伪静态
在Apache配置完httpd.conf文件,
<Directory>
AllowOverride None 改为 AllowOverride All
</Directory>
并开启 mod_rewrite.so模块
去掉改行注释:" LoadModule rewrite_module modules/mod_rewrite.so" 后,
即可在根目录下新建.htaccess文件使用伪静态进行重定向,在linux系统中,.htaccess默认是隐藏的,可以使用指令 "ls -a" 查看。
.htaccess 文件用正则表达式进行模式匹配
. | 匹配任何单个字符 | c.t 将匹配 cat , cot ,cut ,等。 |
+ | 重复上一个匹配一次或多次 | a+ 匹配 a ,aa , aaa ,等 |
* | 重复前一个匹配零次或多次。 | a* 匹配所有相同的 a+ 匹配项,但也匹配空字符串。 |
? | 使匹配可选。 | colou?r 会匹配 color 和colour 。 |
^ | 称为锚点,匹配字符串的开头 | ^a 匹配一个以 a开头的字符串。 |
$ | 另一个锚,这匹配字符串的结尾。 | a$ 匹配以一个以a结尾的字符串 。 |
( ) | 将多个字符组合到一个单元中,并捕获匹配以用于反向引用。 | (ab)+ 匹配ababab 例如, (abc|bcd|cde),表示这一段是abc、bcd、cde三者之一,顺序也必须一致,+ 适用于组。 |
[ ] | 字符类 - 匹配其中一个字符 | c[uoa]t 匹配 cut , cot 或cat 。 |
[^ ] | 非字符类 - 匹配未指定的任何字符 | c[^/]t 匹配 cat 或 c=t 但 不匹配c/t |
常用组合:
RewriteEngine On #表示开启重写引擎
RewriteBase / #表示以根目录为基准
#RewriteCond %{REQUEST_FILENAME} !-f #如果不是文件,则执行下面的规则
#RewriteCond %{REQUEST_FILENAME} !-d #如果不是文件,则执行下面的规则
#RewriteCond %{REQUEST_URI} !^/css #下面规则对中不包含 "/css" 的url地址生效
#RewriteCond %{REQUEST_URI} !^/js #下面规则对中不包含 "/css" 的url地址生效
#RewriteCond %{REQUEST_URI} !^/images #下面规则对不包含 "/css" 的url地址生效
#RewriteCond %{REQUEST_URI} !^.*(\.css|\.js|\.gif|\.png|\.jpg|\.jpeg|\.xml)
# 下面规则对不包含".css", ".js", ".gif",".png",".jpg",".jpeg",".xml"的url地址生效
# 解决重写后接不到问号后面的参数
RewriteCond %{QUERY_STRING} ^(.*)$
# 把URL中的index.php省略掉
# $1 表示第一个()中匹配到的内容,可以跳过index.php直接到后面的路径
# 比如 localhost/index.php/abc/csd ,直接输入 localhost/abc/csd 可以访问到相同的路径
RewriteRule ^(.*)$ index.php?$1 [L,QSA]
常用后缀
L(last):立即停止重定向的进程,不再应用更多规则。
NC(nocase):不区分大小写。
F(forbidden):强制当前URL为被禁止的,即,立即反馈一个HTTP响应代码403(被禁止的)。
QSA(qsappend):将原始请求URL中的任何查询字符串追加到重写目标中创建的任何查询字符串、
QSD(qsdiscard):丢弃附加到传入URI的任何查询字符串。
相对路径问题
一个html文档被重定向了,其中引入的link和script都是使用 "./css/xxxx.css"相对路径的方式,在请求的url路径不在根目录下的时候会引入不到,比如根目录在 "www.xxxx.com/",重定向设置所有文档到 根目录下的 index.html 文件,这个时候我们访问
"www.xxxx.com/setwt/jukuk/qwrer",如果在根目录下的 index.html 中console.log(window.location.href);
会输出"http://localhost/setwt/jukuk/qwrer",这个时候再去用 "./css/xxxx.css"的方式引入css文件就变成了在"http://localhost/setwt/jukuk/css"路径下查找xxxx.css文件,自然是引入不到的。
使用伪静态的时候一定要用绝对路径引入文件,同时要用 "RewriteCond" 过滤掉所有资源文件,使其不被重定向。
Apache 官方参考文档:http://httpd.apache.org/docs/2.4/mod/mod_rewrite.html
Nginx 重定向
参考文章:https://www.cnblogs.com/cheyunhua/p/8128039.html
Nginx服务器可以配置rewrite(重写)和http_proxy(http代理),不同于Apache服务器的 RewriteCond 和 RewriteRule,个人认为Nginx的配置更加简单。
1. 对某个域名进行重定向,例如把example.org重定向到www.example.org
server{
listen 80;
server_name example.org;
return 301 http://www.example.org$request_uri;
}
$request_uri 指的是跟在域名后面的部分。
2. 把在域名下 example.com 和所有三级域名不是 www (www.example.com) 域名重定向到 www.example.com
server{
listen 80;
server_name example.com www.example.com;
...
}
server{
listen 80 default_server;
server_name _;
return 301 http://example.com$request_uri;
}
3. 将路径中包含baidu的url重定向到 https://www.baidu.com
rewrite时的匹配规则也是正则,可以直接在 location 的位置匹配,也可以在 location 底下通过rewrite匹配。
location ~^/(.*)baidu {
return 301 https://www.baidu.com$request_uri;
}
通过location把REQUEST_URI中带有/baidu的url重定向到域名 https://www.baidu.com后接所有请求路径。
location / {
rewrite ^(.*)baidu https://www.baidu.com/$request_uri;
}
直接用rewrite规则匹配,在根目录进行匹配。
4. http代理,做域名转发
location / {
proxy_pass https://www.baidu.com
}
url中的地址不变但是REQUEST_URI和所有参数都会转发到百度的域名地下,返回结果与输入到百度域名底下的返回结果一致,可用来结决跨域处理问题。。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)${
...
}
这个可以匹配一定格式的图片文件,可以重定向或者代理到静态资源文件仓库地址(仓库文件所在REQUEST_URI要与请求地址的REQUEST_URI保持一致)。