Nginx 301重定向域名

## 为何要使用301重定向 在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名、网页的扩展名改变、网站域名改变等。如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个404错误信息页面,访问流量白白丧失。不仅如此,之前该页面的一切积累(比如PR值)就都白费了。 301重定向不仅能使页面实现自动跳转,对于搜索引擎来说,也可能可以传递PR值。   **nginx重定向规则详细介绍**   [http://www.jefflei.com/post/1015.html](http://www.jefflei.com/post/1015.html) **rewrite命令** nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令格式如下: rewrite 正则表达式 替换目标 flag标记 flag标记可以用以下几种格式: last – 基本上都用这个Flag。 break – 中止Rewirte,不在继续匹配 redirect – 返回临时重定向的HTTP状态302 permanent – 返回永久重定向的HTTP状态301 例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,2对应第二个括号(.)中对应的字符串: location /download/ { rewrite ^(/download/.)/m/(.).. 1/nginx-rewrite/2.gz break; } **nginx重定向的IF条件判断** 在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种: 正则表达式 如: 匹配判断 ~ 为区分大小写匹配; !~为区分大小写不匹配 ~* 为不区分大小写匹配;!~为不区分大小写不匹配 例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下: if (http_user_agent ~ MSIE) { rewrite ^(.*) /nginx-ie/$1 break; } **文件和目录判断 ** -f和!-f判断是否存在文件 -d和!-d判断是否存在目录 -e和!-e判断是否存在文件或目录 -x和!-x判断文件是否可执行 例如下面设定nginx在文件和目录不存在的时候重定向: if (!-e $request_filename) { proxy_pass http://127.0.0.1/; } ...

2018年12月10日 · 5 分钟 · 天边的星星

tomcat配置301重定向

tomcat默认情况下不带www的域名是不会跳转到带www的域名的,而且也无法像apache那样通过配置.htaccess来实现。如果想要把不带“www’的域名重定向到带”www”域名下,又不想写代码,可以使用UrlRewriteFilter来实现。 1.简介 urlRewriteFilter是一个用于改写URL的Web过滤器,类似于Apache的mod_rewrite。适用于任何Web应用服务器(如 Tomcat,jboss,jetty,Resin,Orion等)。其典型应用就把动态URL静态化,便于搜索引擎爬虫抓取你的动态网页。 2.下载 下载UrlRewriteFilter wget http://urlrewritefilter.googlecode.com/files/urlrewritefilter-4.0.3.jar 并放入tomcat的 WEB-INF/lib下 3.配置tomcat 编辑WEB-INF/web.xml 在其它servlet mapping前加入 <filter-name>UrlRewriteFilter</filter-name> <filter-class>org.tuckey.web.filters.urlrewrite.UrlRewriteFilter</filter-class> </filter> <filter-mapping> <filter-name>UrlRewriteFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>" data-snippet-id="ext.d9335c889eb8c29f7d0586484daf2dcb" data-snippet-saved="false" data-codota-status="done">&lt;filter&gt; &lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt; &lt;filter-class&gt;org.tuckey.web.filters.urlrewrite.UrlRewriteFilter&lt;/filter-class&gt; &lt;/filter&gt; &lt;filter-mapping&gt; &lt;filter-name&gt;UrlRewriteFilter&lt;/filter-name&gt; &lt;url-pattern&gt;/*&lt;/url-pattern&gt; &lt;dispatcher&gt;REQUEST&lt;/dispatcher&gt; &lt;dispatcher&gt;FORWARD&lt;/dispatcher&gt; &lt;/filter-mapping&gt; 4.添加跳转规则 在WEB-INF下新建urlrewite.xml文件,加入跳转规则 <rule> <name>seo redirect</name> <condition name=&quot;host&quot; operator=&quot;notequal&quot;>^www.example.com</condition> <condition name=&quot;host&quot; operator=&quot;notequal&quot;>^localhost</condition> <from>^/(.*)</from> <to type=&quot;permanent-redirect&quot; last=&quot;true&quot;>http://www.example.com/$1</to> </rule> </urlrewrite>" data-snippet-id="ext.8be7c6714e65fa3f79b0e1c6c6215563" data-snippet-saved="false" data-codota-status="done">&lt;urlrewrite&gt; &lt;rule&gt; &lt;name&gt;seo redirect&lt;/name&gt; &lt;condition name="host" operator="notequal"&gt;^www.example.com&lt;/condition&gt; &lt;condition name="host" operator="notequal"&gt;^localhost&lt;/condition&gt; &lt;from&gt;^/(.*)&lt;/from&gt; &lt;to type="permanent-redirect" last="true"&gt;http://www.example.com/$1&lt;/to&gt; &lt;/rule&gt; &lt;/urlrewrite&gt; 参考文章 http://nematodes.org/martin/2010/02/04/301-permanent-redirect-with-tomcat-howto/ ...

2018年12月10日 · 1 分钟 · 天边的星星

Java AES256加密解密实现

import it.sauronsoftware.base64.Base64; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.Security; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import org.bouncycastle.jce.provider.BouncyCastleProvider; /** java实现AES256加密解密 依赖说明: bcprov-jdk15-133.jar:PKCS7Padding javabase64-1.3.1.jar:base64 local_policy.jar 和 US_export_policy.jar需添加到%JAVE_HOME%\jre\lib\security中(lib中版本适合jdk1.7) */ public class AES256 { public static byte[] encrypt(String content, String password) { try { //”AES”:请求的密钥算法的标准名称 KeyGenerator kgen = KeyGenerator.getInstance(“AES”); //256:密钥生成参数;securerandom:密钥生成器的随机源 SecureRandom securerandom = new SecureRandom(tohash256Deal(password)); kgen.init(256, securerandom); //生成秘密(对称)密钥 SecretKey secretKey = kgen.generateKey(); //返回基本编码格式的密钥 byte[] enCodeFormat = secretKey.getEncoded(); //根据给定的字节数组构造一个密钥。enCodeFormat:密钥内容;”AES”:与给定的密钥内容相关联的密钥算法的名称 SecretKeySpec key = new SecretKeySpec(enCodeFormat, “AES”); //将提供程序添加到下一个可用位置 Security.addProvider(new BouncyCastleProvider()); //创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。 //”AES/ECB/PKCS7Padding”:转换的名称;”BC”:提供程序的名称 Cipher cipher = Cipher.getInstance(“AES/ECB/PKCS7Padding”, “BC”); ...

2018年12月9日 · 2 分钟 · 天边的星星

轻量级微服务架构下总结

轻量级的微服务 总结:整个微服务使用Spring boot + Docker 冰山上,ZooKeeper服务注册、Node.js服务网关、Jenkins等冰山下。 总体上可以分为:开发框架(上)、容器技术(上)、注册中心(下)、调用中心、部署中心、日志中心、监控中心、追踪中心、消息中心、配置中心。 注册中心:用于注册微服务相关配置信息的中心 调用中心:用于提供给前端调用的统一入口(我们选用Node.js实现) 部署中心:用于编译并打包微服务源码并将其部署到Docker引擎中(Jenkins) 日志中心:用于收集并管理微服务应用程序中产生的日志 监控中心:用于监控微服务的实时运行状况 追踪中心:用于最终微服务的调用轨迹 消息中心:用于解耦服务之间的调用关系 配置中心:用于管理微服务应用程序所需的配置参数 (我们认为,中心分为两类:一类是含有业务意义的中心,另一类是不含业务意义的中心-只是技术层面的中心) 微服务日志 总结:docker中查看日志路径 /var/lib/docker/containers/<container_id目录看到一个container_id-json.log文件,Docker默认使用docker logs查看的就是这些json文件,Docker默认使用Json-file格式,还有其他格式 none:容器不输出任何日志 json-file:容器默认输出的日志以json格式写入文件中(默认) syslog:容器输出日志写入宿主机的Syslog中 journald:容器输出日志写入宿主机的Journald中 gelf:容器输出的日志以GELF(Graylog Extended log fromat)格式写入Graylog中 fluentd: 容器输出的日志写入宿主机的Fluentd中 awalogs:容器输出日志写入Ammazon CloudWatch Logs中 splunk:容器输出日志写入splunk中 etwlogs:容器输出日志写入ETW (event tracing for windows)中 gcplogs:容器输出日志写入GCP(Google Cloud Platform)中 nats:容器输出日志写入NATS服务器中 docker中 –log-driver参数配置日志驱动 –log-opt max-size –log-opt max-file 分别设置日志文件大小和日志文件数量 例如:docker run -p 80:80 –log-dirver json-file –log-opt max-size=10m –log-opt max-file=3 –name xxx 容器名称 docker日志驱动(https://docs.docker.com/engine/admin/logging/overview/) ...

2018年8月26日 · 1 分钟 · 天边的星星

Java 执行运行Jar文件

java执行jar文件命令 java -jar 文件.jar 到此就成功执行jar了, 我的jar中有多个入口,我想执行其他的入口,怎么搞? 不着急慢慢看下去 java运行jar包中指定Class的main方法,这时可以通过: java -cp xxx.jar xxx.com.xxxx [args] 其中-cp命令是将xxx.jar加入到classpath,这样java class loader就会在这里面查找匹配的类。 mac中执行apple script运行jar的命令 on run {input, parameters} set p to POSIX path of (path to me) do shell script “java -jar ” & p & “Contents/Jar/JavaSwingTest.jar” end run

2017年12月5日 · 1 分钟 · 天边的星星

Java + 腾讯企业邮箱 + javamail发送邮件

搞了一上午终于搞定了腾讯云企业邮箱的发送,话说腾讯云的东西就是繁琐,但是好用,还是得认真看文档啊,不然真的摸不着北。 腾讯企业邮箱官网:http://exmail.qq.com 点击开通 你跟着步骤走就行了,没啥难的,如果你没有域名,你就去买一个呗,也花不了多少钱的。 注册成功后,是这个页面,并且会有一个弹窗告诉你一些信息 现在你点击添加成员,因为你不添加成员的话你是无法发送邮件的。 完成后是这样 然后你打开腾讯企业邮箱登录界面,输入你刚才增加的成员邮箱的:登录名 + 密码,进去后是一个类似于普通QQ邮箱的界面 第一次进去会要求重新设置密码,设置一下就好了。默认的已经开通了SSL协议; 如何设置IMAP、POP3/SMTP及其SSL加密方式? 如果您的电子邮件客户端支持SSL,可以在设置中选择使用SSL。 <div> </div> <div> <div> <div> <div> **通用配置参数:** </div> <div> **(我们已经默认都支持这些协议,用户无需自己手动开启这些服务器与端口)** </div> <div> </div> <div> **POP3/SMTP协议** <div> <div> 接收邮件服务器:pop.exmail.qq.com ,使用SSL,端口号995 </div> <div> 发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465 </div> <div> 海外用户可使用以下服务器 </div> <div> <div> 接收邮件服务器:hwpop.exmail.qq.com ,使用SSL,端口号995 </div> <div> 发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465 </div> </div> <div> </div> <div> <div> **IMAP协议** </div> <div> <div> 接收邮件服务器:imap.exmail.qq.com ,使用SSL,端口号993 </div> <div> <div> 发送邮件服务器:smtp.exmail.qq.com ,使用SSL,端口号465 </div> <div> 海外用户可使用以下服务器 </div> <div> <div> 接收邮件服务器:hwimap.exmail.qq.com ,使用SSL,端口号993 </div> <div> <div> 发送邮件服务器:hwsmtp.exmail.qq.com ,使用SSL,端口号465 </div> <div> </div> </div> </div> </div> </div> </div> </div> </div> </div> <div> <div> <div> <div> **账户名:**您的企业邮箱账户名,账户名需要填写完整的邮件地址 </div> <div> **密码:**您的企业邮箱密码 </div> <div> **电子邮件地址:**您的企业邮箱的完整邮件地址 </div> <div> </div> <div> 使用SSL协议之前,请您先参考[常用客户端的一般配置方式](http://service.exmail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1000585): </div> </div> </div> </div> </div> </div> 使用java代码发送邮箱 ...

2017年12月5日 · 1 分钟 · 天边的星星

SpringBoot 学习网站收藏

Spring Boot加载配置文件 https://my.oschina.net/wangyuefive/blog/704615#h3_4 问题3:如何根据线上环境和线下环境加载不同的配置?如何加载多个配置文件? 1、Profiles: Spring Profiles提供了一种隔离应用程序配置的方式,并让这些配置只能在特定的环境下生效。在配置文件中,用spring.profiles.active属性来指定特定环境的配置文件。在Spring Boot中多环境配置文件名需要满足application-{profile}.properties的格式,其中{profile}对应你的环境标识,比如: application-dev.properties:开发环境 application-test.properties:测试环境 application-prod.properties:生产环境 至于哪个具体的配置文件会被加载,需要在application.properties文件中通过spring.profiles.active属性来设置,其值对应{profile}值。例如: application.properties配置:spring.profiles.active = dev即指定application-dev.properties会被加载。 2、通过启动参数指定运行环境。 通过命令行启动: ` java -jar xxxxx.jar &lt;span class="hljs-comment">--spring.profiles.active=prod。&lt;/span>` 上述指定为prod环境,则spring application会自动根据application-{profile}.properties的格式找到application-prod.properties文件加载。 3、加载多个自定义文件。 例如: ` spring.profiles.active = dev,database` 等于告诉Spring Boot加载application-dev.properties和application-database.properties文件,从而实现多个配置文件的加载。 四种读取properties文件的方式 http://www.imooc.com/article/18252 集成Mybatis http://www.imooc.com/article/15406 开启定时任务 http://www.imooc.com/article/15612 spring-boot上传文件MultiPartFile获取不到文件问题解决 http://blog.csdn.net/happy_cheng/article/details/54178392 Spring boot上传文件时MultipartFile为空问题 http://blog.csdn.net/tanga842428/article/details/72773773 spring boot默认日志配置,以及改用log4j日志配置学习使用排出多余的依赖 http://blog.csdn.net/yanweihpu/article/details/54139382 http://blog.csdn.net/loongshawn/article/details/50951329

2017年9月20日 · 1 分钟 · 天边的星星

spring-boot–使用thymeleaf模板

参考:http://blog.csdn.net/u014695188/article/details/52347318 参考:http://blog.csdn.net/u012706811/article/details/52185345 整体步骤: (1) 在pom.xml中引入thymeleaf; (2) 如何关闭thymeleaf缓存 (3) 编写模板文件.html Spring Boot默认就是使用thymeleaf模板引擎的,所以只需要在pom.xml加入依赖即可: «/span>dependency> «/span>groupId>org.springframework.boot</groupId> «/span>artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> Thymeleaf缓存在开发过程中,肯定是不行的,那么就要在开发的时候把缓存关闭,只需要在application.properties进行配置即可: [html] view plain copy ######################################################## ###THYMELEAF (ThymeleafAutoConfiguration) ######################################################## #spring.thymeleaf.prefix=classpath:/templates/ #spring.thymeleaf.suffix=.html #spring.thymeleaf.mode=HTML5 #spring.thymeleaf.encoding=UTF-8 # ;charset= is added #spring.thymeleaf.content-type=text/html # set to false for hot refresh spring.thymeleaf.cache=false 编写模板文件src/main/resouces/templates/helloHtml.html [html] view plain copy 编写访问路径(com.kfit.test.web.TemplateController): [html] view plain copy package com.kfit.test.web; import java.util.Map; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** 模板测试. @author Administrator */ @Controller publicclass TemplateController { /** ...

2017年9月19日 · 2 分钟 · 天边的星星

MyBatis的返回参数类型

MyBatis的返回参数类型分两种 1. 对应的分类为: 1.1.resultMap: 1.2.resultType: 2 .对应返回值类型: 2.1.resultMap:结果集 2.2.resultType:int,string ,long ,class 3. 注意点: 在MyBatis进行查询映射时,其实查询出来的每一个属性都是放在一个对应的Map里面的,其中键是属性名,值则是其对应的值。 3.1 当提供的返回类型属性是resultType时,MyBatis会将Map里面的键值对取出赋给resultType所指定的对象对应的属性。所以其实MyBatis的每一个查询映射的返回类型都是ResultMap,只是当提供的返回类型属性是resultType的时 候,MyBatis对自动的给把对应的值赋给resultType所指定对象的属性。 3.2 当提供的返回类型是resultMap时,因为Map不能很好表示领域模型,就需要自己再进一步的把它转化为对应的对象,这常常在复杂查询中很有作用。 4.案例 4.1:resultMap案例 **[html]** [view plain](http://blog.csdn.net/u010235716/article/details/51698787#) [copy](http://blog.csdn.net/u010235716/article/details/51698787#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1" data-mce-fragment="1"> </embed> </div> </div> - <span class="tag"><</span><span class="tag-name">select</span> <span class="attribute">id</span>=<span class="attribute-value">&#8220;selectByPrimaryKey&#8221;</span> <span class="attribute">resultMap</span>=<span class="attribute-value">&#8220;BaseResultMap&#8221;</span> <span class="attribute">parameterType</span>=<span class="attribute-value">&#8220;java.lang.Long&#8221;</span> <span class="tag">></span> - select - <span class="tag"><</span><span class="tag-name">include</span> <span class="attribute">refid</span>=<span class="attribute-value">&#8220;Base_Column_List&#8221;</span> <span class="tag">/></span> - from common_car_make - where <span class="attribute">id</span> = #{id,<span class="attribute">jdbcType</span>=<span class="attribute-value">BIGINT</span>} - <span class="tag"></</span><span class="tag-name">select</span><span class="tag">></span> 4.2 resultType–long案例 ...

2017年8月26日 · 2 分钟 · 天边的星星

CentOS+Nginx一步一步开始配置负载均衡

Nginx负载均衡的理解 Nginx是一个轻量级的、高性能的WebServer,他主要可以干下面两件事: 作为http服务器(和apache的效果一样) 作为反向代理服务器实现负载均衡 现在Nginx到处都可以见到,经常会看到宕机后的网页会显示nginx的字样,这也说明Nginx由于高性能、使用配置简、开源单这些特点被越来越多的用户所接受,所使用。 其中第一种作为http服务器,结合php-fpm进程,对发来的请求进行处理,nginx本身并不会解析php,他只是作为一个服务器,接受客户端发来的请求,如果是php请求,则交给php进程处理,并将php处理完成之后的结果发送给客户端。这个很简单,安装好nginx+php-fpm之后配置好各自的配置文件,启动就可以实现。运行原理可以看下面这段解释: Nginx不支持对外部程序的直接调用或者解析,所有的外部程序(包括PHP)必须通过FastCGI接口来调用。FastCGI接口在Linux下是socket(这个socket可以是文件socket,也可以是ip socket)。为了调用CGI程序,还需要一个FastCGI的wrapper(wrapper可以理解为用于启动另一个程序的程序),这个wrapper绑定在某个固定socket上,如端口或者文件socket。当Nginx将CGI请求发送给这个socket的时候,通过FastCGI接口,wrapper接收到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着,wrapper再将返回的数据通过FastCGI接口,沿着固定的socket传递给Nginx;最后,Nginx将返回的数据发送给客户端。这就是Nginx+FastCGI的整个运作过程,如图下图所示。 [][1] 上面这段话解释了nginx+fastcgi的运行机制,在nginx配置文件中会对请求进行匹配,并作做出相应的处理,比如说直接返回错误文件(这里和上面说的有点区别,我估计是nginx内部对html等这些静态文件可以做类似上图的解析),使用php进程对php请求进行处理(这里的php进程可以是多个)。 第二种是用反向代理事项负载均衡,这个其实其实很简单,说起来就是自己定义一组server,对请求进行匹配,并将请求转给server中的任意一个处理,来减轻每个server的压力,先看看网上对反向向代理的定义: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 反向代理是和正向代理(或者叫代理) 相反的,代理大家定听过吧,为了更方便的访问B资源,通过A资源间接的访问B资源,特点就是用户知道自己最终要访问的网站是什么,但是反向代理用户是不知道代理服务器后边做了什么处理的,反向代理中服务真正的处理服务器放在内网,对外网而言只可以访问反向代理服务器,这也大大提高了安全性。 安装软件 nginx安装很简单 1、安装nginx需要的环境,pcre(作用rewrite)、zlib(作用压缩)、ssl,这个也可以自己下载编译安装 yum -y install zlib; yum –y install pcre; yum –y install openssl; 2、下载安装nginx-*.tar.gz。 tar –zxvf nginx-1.2.8.tar.gz –C ./; cd nginx-1.2.8; ./congigure –prefix=/usr/local/nginx; make && make install; 3、配置 这里配置的时候只需要修改http{}之间的内容就行了,修改的第一个地方就是设置服务器组,在http节点之间添加 upstream myServer{ server www.88181.com:80; #这里是你自己要做负载均衡的服务器地址1 server www.linux.com:8080; #这里是要参与负载均衡的地址2 } nginx中的upstream支持下面几种方式:轮询(默认,按照时间顺序对所有服务器一个一个的访问,如果有服务器宕机,会自动剔除)、weight(服务器的方位几率和weight成正比,这个可以在服务器配置不均的时候进行配置)、ip_hash(对每个请求的ip进行hash计算,并按照一定的规则分配对应的服务器)、fair(按照每台服务器的响应时间(rt)来分配请求,rt晓得优先分配)、url_hash(按照访问url的hash值来分配请求),我这里使用了默认的轮训方式。 将请求指向myServer location / { proxy_pass http://myServer; } 完整的文件(删除注释)如下: worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; upstream myServer{ server www.linux.com:80; server www.88181.com:8080; } server { listen 80; server_name my22; location / { proxy_pass http://myServer; } } } 设置反向代理后端作为负载均衡的两个服务器 ...

2016年8月18日 · 1 分钟 · 天边的星星