php语言 百分网手机站

apache服务器伪静态教程

时间:2020-09-05 08:22:40 php语言 我要投稿

apache服务器伪静态教程

  导语:虽然网上有很多教程,不过发现大部分都是抄袭一个人的,一点都不全,所以小编写了一个简单的易于理解的教程,欢迎参考!

  我学习.htaccess是从目录保护开始的,这个也比较简单,网上也有一些编辑器可以选择,这儿就不说了,教程从绑定域名到子目录开始,网上也有教程,大部分都是抄袭一个人的,我在这儿解说一下,教程写法是这样的:

  RewriteEngineOn

  RewriteCond%{HTTP_HOST}^(www.)?xxx.com$

  RewriteCond%{REQUEST_URI}!^/blog/

  RewriteCond%{REQUEST_FILENAME}!-f

  RewriteCond%{REQUEST_FILENAME}!-d

  RewriteRule^(.*)$/blog/$1

  #没有输入文件名的默认到到首页

  RewriteCond%{HTTP_HOST}^(www.)?xxx.com$

  RewriteRule^(/)?$blog/index.php[L]

  下面我开始解说一下上面的意思:

  【RewriteEngineOn】表示重写引擎开,关闭off,作用就是方便的开启或关闭以下的语句,这样就不需要一条一条的注释语句了。

  【RewriteCond%{HTTP_HOST}^(www.)?xxx.com$】

  这是重写条件,前面%{HTTP_HOST}表示当前访问的网址,只是指前缀部分,格式是www.xxx.com不包括“http://”和“/”,^表示字符串开始,$表示字符串结尾,.表示转义的.,如果不转义也行,推荐转义,防止有些服务器不支持,?表示前面括号www.出现0次或1次,这句规则的意思就是如果访问的网址是xxx.com或者www.xxx.com就执行以下的语句,不符合就跳过。

  【RewriteCond%{REQUEST_URI}!^/blog/】

  也是重写条件,%{REQUEST_URI}表示访问的相对地址,就是相对根目录的地址,就是域名/后面的成分,格式上包括最前面的“/”,!表示非,这句语句表示访问的'地址不以/blog/开头,只是开头^,没有结尾$

  【RewriteCond%{REQUEST_FILENAME}!-f】

  【RewriteCond%{REQUEST_FILENAME}!-d】

  这两句语句的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径

  【RewriteRule^(.*)$/blog/$1】重写规则,最重要的部分,意思是当上面的RewriteCond条件都满足的时候,将会执行此重写规则,^(.*)$是一个正则表达的匹配,匹配的是当前请求的URL,^(.*)$意思是匹配当前URL任意字符,.表示任意单个字符,*表示匹配0次或N次(N>0),后面/blog/$1是重写成分,意思是将前面匹配的字符重写成/blog/$1,这个$1表示反向匹配,引用的是前面第一个圆括号的成分,即^(.*)$中的.*,其实这儿将会出现一个问题,后面讨论。

  【RewriteCond%{HTTP_HOST}^(www.)?xxx.com$】

  【RewriteRule^(/)?$blog/index.php[L]】

  这两句的意思是指请求的host地址是www.xxx.com是,如果地址的结尾只有0个或者1个“/”时,将会重写到子目录下的主页,我猜想这主要因为重写后的地址是不能自动寻找主页的,需要自己指定。

  现在说说出现的问题,RewriteRule^(.*)$/blog/$1前部分^(.*)$将会匹配当前请求的url,例如:请求网址是http://www.xxx.com/a.html,到底是匹配整个http://www.xxx.com/a.html,还是只匹配/a.html即反斜杠后面的成分,还是只匹配a.html。

  答案是:根据RewriteBase规则规定,如果rewritebase为/,将会匹配a.html,不带前面的反斜杠,所以上条语句应该写成RewriteRule^(.*)$blog/$1(不带/),不过实际应用上带上前面的反斜杠,也可以用,可能带不带都行。现在问题出来了,如果不设置rewritebase为/,将会匹配整个网址http://www.xxx.com/a.html,显然这是错误的,所以应该添加这条:

  RewiteBase/

  还有一个问题是,不能保证每个人输入的网址都是小写的,如果输入大写的呢,linux系统是区分大小写的,所以应该在RewriteCond后添加[NC]忽略大小写的。

  至此,完整的语句应该是:

  ####start####

  RewriteEngineOn

  RewiteBase/

  RewriteCond%{HTTP_HOST}^(www.)?xxx.com$[NC]

  RewriteCond%{REQUEST_URI}!^/blog/

  RewriteCond%{REQUEST_FILENAME}!-f

  RewriteCond%{REQUEST_FILENAME}!-d

  RewriteRule^(.*)$blog/$1

  #没有输入文件名的默认到到首页

  RewriteCond%{HTTP_HOST}^(www.)?xxx.com$[NC]

  RewriteRule^(/)?$blog/index.php[L]


【apache服务器伪静态教程】相关文章:

php的apache伪静态08-24

php简单伪静态实例09-28

PHP伪静态的方法09-28

PHP伪静态的几种方法09-10

Java UrlRewriter伪静态技术运用分析12-01

PHP运行于Apache 模块方式06-08

linux下卸载apache方法介绍08-03

Linux+Apache+Mysql+PHP优化技巧09-20

php技术生成静态页面的方法08-15