相关概念
伪静态网页
伪静态就是通过某些技术(如rewrite)把动态网页的URL伪装成静态网页的URL地址。伪静态网页实质上用户访问的还是动态网页,只不过给用户看起来的URL地址时符合静态网页地址特征的,因此,用户和搜索引擎会误以为是静态网页。
伪静态网页的特点:
从网站的URL地址来看,伪静态表面上看起来是静态内容(如地址后缀是html),实质上访问的还是通过rewrite规则重写URL地址之后的动态网页。
从性能上来说,伪静态功能不但没有提升网站性能,反而会降低网站的性能;要提高性能,应当尽可能将动态网页转为真正的静态页面。
但是从用户体验角度来看,改写后的URL地址规范美观,有利于搜索引擎抓取以及提升用户访问体验。
伪静态网页的实现过程,一般是SEO运行产品提出需求,由开发和运维共同实现。
Rewrite
Rewrite的主要功能是实现对URL地址的重写,就是把传入Web的请求重定向到其他URL。
Rewrite的功能:
- URL Rewrite最常见的应用是URL伪静态化,是将动态页面显示为静态页面方式的一种技术。比如http://www.123.com/news/index.php?id=123 使用URLRewrite 转换后可以显示为 http://www.123.com/news/123.html。Rewrite可以让我们网站的网页更容易被搜索引擎所收录。
- 从安全角度上讲,如果在URL中暴露太多的参数,无疑会造成一定量的信息泄漏,可能会被一些黑客利用,对你的系统造成一定的破坏,所以静态化的URL地址可以给我们带来更高的安全性。
- 实现网站地址跳转,例如用户访问360buy.com,将其跳转到jd.com。例如当用户访问test.com的 80 端口时,将其跳转到 443 端口。
示例
Nginx的Rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配的,前文在安装Nginx软件时就已经安装了这个PCRE软件,以及让Nginx支持Rewrite的功能,默认参数编译Nginx就会安装支持Rewrite的模块,但是,也必须要PCRE软件的支持。
Nginx实现rewrite的模块:Module ngx_http_rewrite_module
官方示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| if ($http_user_agent ~ MSIE) { rewrite ^(.*)$ /msie/$1 break; }
if ($http_cookie ~* "id=([^;]+)(?:;|$)") { set $id $1; }
if ($request_method = POST) { return 405; }
if ($slow) { limit_rate 10k; }
if ($invalid_referer) { return 403; }
|
拓展:https://www.cnblogs.com/LiuYanYGZ/p/5903946.html
相关需求
if示例
1 2 3
| Syntax: if (condition) { ... } Default: — Context: server, location
|
需求1:过滤请求nginx的URL中包含id=520的请求,转到172.16.1.7的80端口处理
1 2 3 4 5 6 7 8 9 10 11 12 13
| server { listen 80; server_name www.etiantian.org; root /data/www; location / { index index.html; proxy_set_header Host $http_host; if ($request_uri ~* 'id=520') { proxy_pass http://172.16.1.7:80; } } }
|
set示例
1 2 3
| Syntax: set $variable value Default: — Context: server, location, if
|
需求2:将用户请求url.etiantian.org.zh跳转到url.etiantian.org/zh,将用户请求url.etiantian.org.en跳转到url.etiantian.org/en
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| server { listen 80; server_name url.etiantian.org.zh url.etiantian.org.en; location / { set $lang zh; if ($http_host ~* "en"){ set $lang en; } rewrite ^/$ http://url.etiantian.org/$lang/ permanent; } }
server { listen 80; server_name url.etiantian.org; root /data/www; location / { index index.html; } }
|
return示例
1 2 3
| Syntax: return code [text] Default: — Context: server, location, if
|
需求3:根据访问设备跳转
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| server { listen 80; server_name www.etiantian.org; root /data/www; location / { index index.html; } default_type text/html; charset utf-8; if ($http_user_agent ~* "chrome|MSIE|firefox") { #return 200 '请更换浏览器\n'; #return 520; return 301 http://www.oldboyedu.com; } }
|
rewrite示例
1 2 3
| Syntax: rewrite regex replacement [flag] Default: — Context: server, location, if
|
需求3:实现访问http://blog.etiantian.org跳转到http://www.etiantian.org/blog/oldboy.html。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server { listen 80; server_name blog.etiantian.org; if ( $http_host ~* "^(.*)\.etiantian\.org$") { set $domain $1; rewrite ^(.*) http://www.etiantian.org/$domain/oldboy.html break; } } server { listen 80; server_name www.etiantian.org; root /data/www; location / { index index.html; } }
|
需求4:防盗链,发现有外站请求本站的图片URL,就返回一张盗链提示图片
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| server { listen 80; server_name www.etiantian.org; root /data/www; charset utf-8; default_type text/html; location / { index index.html; } location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip)$ { valid_referers none blocked server_names *.etiantian.org etiantian.org; if ($invalid_referer) { rewrite ^/ http://test.oldboy.com/img/nolink.jpg; } } }
server { listen 80; server_name test.oldboy.com; root /data/test; charset utf-8; location / { index index.html; } }
|
需求5: 用户通过手机设备访问www.etiantian.org跳转至 m.etiantian.org
1 2 3 4 5 6 7 8 9 10 11
| server { listen 80; server_name www.etiantian.org; root /code; location / { index index.html; if ($http_user_agent ~* "android|phone|iphone") { rewrite ^(.*)$ http://m.etiantian.org permanent; } } }
|
需求6: 用户通过http协议请求,能自动跳转至https协议
1 2 3 4 5 6
| server { listen 80; server_name www.etiantian.org; rewrite ^(.*)$ https://$http_host$1; }
|
需求7: 错误页面优雅显示,当访问服务器遇到403 404 502等错误时,自动转到临时维护的静态页https://404.life/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| server { listen 80; server_name url.etiantian.org; root /code; charset utf-8; location / { index index.html; } error_page 403 404 500 502 http://www.etiantian.org; location @error_status { rewrite ^(.*)$ /404.html break; } }
|
Nginx关于如何处理error page的介绍:http://nginx.org/en/docs/http/ngx_http_core_module.html#error_page