啥是虚拟主机呢?就是说把你自己的本地的开发的机子变成一个虚拟域名,比如:你在开发pptv下面的一个项目 127.0.0.1/pptv_trunk,你想把自己的机器域名变成www.pptv.com。那么你自己的机器访问方式就成为了一个虚拟域名。

如何配置呢。一步步来:

1 . 打开apache的配置文件 htppd.cnf。分别打开重写扩展和虚拟主机扩展:

LoadModule rewrite_module modules/mod_rewrite.so    这句前面的 注释 # 去掉

Include conf/extra/httpd-vhosts.conf  这句前面的 注释 # 去掉,关键之处

window和linux 差不多稍有不同。文件里面有几个例子,我们先搞一个,其实很简单。

NameVirtualHost *:80

<VirtualHost *:80>

DocumentRoot "D:/wamp/www/pptv_trunk"

ServerName www.pptv.com

<Directory "D:/wamp/www/pptv_trunk>

Options Indexes FollowSymLinks

AllowOverride All

Order allow,deny

Allow from all

</Directory>

</VirtualHost>

好,这样一个虚拟域名在Apache上就配置好了。

3 . 打开windows/Linux的hosts配置文件,这个文件是系统的dns路由文件:

我们编辑一下,绑定刚才的pptv项目,加上这条:

127.0.0.1 pptv.com www.pptv.com

刷新dns:ipconfig /flushdns

虚拟域名VirtualHost配置详解

什么是rewrite? 就是重写,重写访问的url连接,有时候为了访问的url简洁点,比如:

www.pptv.com/i/?user_id=123&time=123&from=web

我觉得这个地址太长了不够简洁,就可以依靠apache的虚拟域名规则把它写的简单一点:

www.pptv.com/i/123/123/web

在学习rewrite之前,我们先详细看一下一个Virtuhost的详细配置解读。

我们还是打开刚的一个虚拟域名,我们对着这个讲述,如何配置rewirite

NameVirtualHost *:80

<VirtualHost *:80>

DocumentRoot "D:/wamp/www/testphp/"

ServerName php.iyangyi.com

ServerAlias www.pptv.cn #可省略

ServerAdmin stefan321@qq.com #可省略

ErrorLog logs/dev-error.log #可省略

CustomLog logs/dev-access.log common #可省略

ErrorDocument 404 logs/404.html #可省略

<Directory "D:/wamp/www/testphp/">

Options Indexes FollowSymLinks

AllowOverride All

Order Allow,Deny

Allow from all

RewriteEngine on

RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_FILENAME} !-f

RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]

</Directory>

</VirtualHost>

我们一个一个的说下如何配置。

1 . 首先需要申明虚拟域名包块,采用xml风格,开始和结束符号对应。*.80表示接受任何ip的80端口,一般是这样写,不改。

<VirtualHost *:80>

***

</VirtualHost>

2 . 进去之后,就是申明DocumentRoot 这是表示:项目代码的路径。填入我们这个项目的代码所在的根目录D:/wamp/www/testphp/就可以了。

3 . ServerName 这个是我们的虚拟域名,也是这次修改的关键。

4 . ServerAlias 这个是我们的虚拟域名的别名,可以不要,他的出现场景就是我们希望另外一个域名也往这个目录下调整。比如 www.pptv.cn 我们也希望跳到这里来,就可以这样做,但是前提是 www.pptv.cn 也要绑定host 127.0.0.1

5 . ServerAdmin 这里填 服务器管理员的邮箱,也可以不要,当服务器出现故障后,如果提前有配置邮箱的话,会往这个邮箱发邮件,或者是显示在网页的错误信息当中。一般我们可以不填。

6 . ErrorLog 这里填 错误日志显示路径,当访问出现错误的时候,就会记录到这里,注意:logs/dev-error.log 这个文件路径是apache的安装目录下的logs 目录 。可以不要。

比如我们访问 http://php.iyangyi.com/f.html 时候, f.html是不存在的一个文件,那么这次就会被记录下来了。

在apache/logs/dev-error.log 中记录下来了:

[Wed Mar 11 11:14:23 2015] [error] [client 127.0.0.1] File does not exist: D:/wamp/www/testphp/f.html

7 . CustomLog 这里填访问日志,用来记录每一次的请求访问,可以不要。注意:logs/dev-access.log 这个文件路径是apache的安装目录下的logs 目录 。记住:路径后面加common。

比如我们访问 http://php.iyangyi.com/f.html 时候

在apache/logs/dev-access.log 中记录下来了这次的访问:

127.0.0.1 - - [11/Mar/2015:11:14:23 +0800] "GET /f.html HTTP/1.1" 404 177

8 . ErrorDocument 这里填 403,404等错误信息调整页面,用来访问出现404页面等情况时的错误页面展示,比较有用,也可以不要。注意:/404.html 这个文件路径是项目的根目录,不是apache的目录 。

我这里放到了D:/wamp/www/testphp/404.html 这里,所以,我们访问一个不存在的文件时,就会自动跳转到这个404.html页面了。

比如我们访问 http://php.iyangyi.com/f.html 时候,就会显示404.html的内容:

所以,我们可以根据业务需要把常用的状态码都给用上:

ErrorDocument 403 /403.html

ErrorDocument 404 /404.html

ErrorDocument 405 /405.html

ErrorDocument 500 /500.html

ErrorDocument 503 /503.html

9 . <Directory "D:/wamp/www/testphp/"> ***** </Directory> 这个是最重要的一步了,这里也是填本项目的路径,然后所有的rewrite规则都是在里面完成。所以这个是很重要的。(rewrite 规则是在<directory> 内设置的)

10 . 我们进入到<Directory> 层次中,这里面很多都是很关键的。我们主要看一些常用的,也是很关键的。Options Indexes FollowSymLinks 这是来设置 是否来显示文件根目录的目录列表的。

设置成:Options Indexes FollowSymLinks 就表示:我访问php.iyangyi.com,如果文件根目录里有 index.html(index.php),浏览器就会显示 index.html的内容,如果没有 index.html,浏览器就会显示这文件根目录的目录列表,目录列表包括文件根目录下的文件和子目录。

到底是优先显示index.php还是index.html 有apache的配置决定的:

<IfModule dir_module>

DirectoryIndex index.html index.htm index.php index.php3

</IfModule>

哪个在前面,目录下如果有这个文件,就优先显示哪个。

如果我不想让别人访问我的目录结构咋搞? ,可以将这个Indexs去掉,或者这样:-Index 就可以啦。

变成:Options FollowSymLinks 或者 Options -Indexes FollowSymLinks

再次访问 php.iyangyi.com ,我们把index.php和index.html删掉了,刷新浏览器,就会显示:

Forbidden

You don't have permission to access / on this server.

11 . AllowOverride All 这个是干嘛的呢?其他教材说的很复杂,我们说简单点,就是允许根目录下的.htaccess起rewrite作用,下面会说到的,我们在根目录下放一个.htaccess文件,也是可以起到url rewrite作用的。

如果想禁止掉这个根目录下的.htaccess文件,就可以这样: AllowOverride None 就可以了。

12 . Order Deny,Allow Allow from all这2个一般是组合在一起用。用来设置访问权限 ,设置哪些ip可以访问这个域名, 哪些ip禁止访问。

所以order是设置这2个的组合排序, 不区分大小写,中间用,分开,中间不能有空格。 
Order Deny,Allow :表示设定“先检查禁止设定,没有设定禁止的全部允许”

Order Allow,Deny : 表示设定“先检查允许设定,没有设定允许的全部禁止”

而且最后的访问结果有第二参数决定!

Deny from All Deny from 127.0.0.1 禁止访问的ip, all 表示全部 
Allow from All Allow from 127.0.0.1 允许访问的ip, all 表示全部

我们看几个他们2个组合的例子。

这个例子:

Order Deny,Allow

Deny from All

表示先检查允许的, 没有允许的全部禁止。但是下却没有Allow,那么就表示是无条件禁止了所有的访问了。

Order Deny,Allow

Deny from all

Allow from 127.0.0.1

上面表示 只允许127.0.0.1访问

Order Allow,Deny

Allow from all

Deny from 127.0.0.1 192.168.1.51

上面表示禁止127.0.0.1和192.168.1.51访问,其他都可以!

所以这个的组合就可以达到很多的过滤访问效果。

RewriteCond 与 RewriteRule 指令格式配置详解

上面花了大量的时间讲述VirtualHost 里面的一些配置参数的写法和作用,接下来就是rewrite的重点了,3个核心的东西:RewriteEngine,RewriteCond,RewriteRule

RewriteEngine 
这个是rewrite的总开关,用来开启是否启动url rewrite,要想打开,像这样就可以了:

RewriteEngine on

RewriteCond 和 RewriteRule 
表示指令定义和匹配一个规则条件,让RewriteRule来重写。说的简单点,RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能。

先看个例子:

RewriteEngine on

RewriteCond  %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*

RewriteRule  index.php            index.m.php

上面的匹配规则就是:如果匹配到http请求中HTTP_USER_AGENT 是 Mozilla//5/.0.* 开头的,也就是用FireFox浏览器访问index.php这个文件的时候,会自动让你访问到index.m.php这个文件。

RewriteCond 和 RewriteRule 是上下对应的关系。可以有1个或者好几个RewriteCond来匹配一个RewriteRule

RewriteCond一般是这样使用的

RewriteCond %{XXXXXXX} + 正则匹配条件

那么RewriteCond可以匹配什么样的数据请求呢? 
它的使用方式是:RewriteCond %{NAME_OF_VARIABLE} REGX FLAG

RewriteCond %{HTTP_REFERER} (www.test.cn)

RewriteCond %{HTTP_USER_AGENT}  ^Mozilla//5/.0.*

RewriteCond %{REQUEST_FILENAME} !-f

上面是常见的3种最常见使用最多的HTTP头连接与请求匹配。

HTTP_REFERER 
这个匹配访问者的地址,php中$_REQUREST中也有这个,当我们需要判断或者限制访问的来源的时候,就可以用它。

比如:

RewriteCond %{HTTP_REFERER} (www.test.cn)

RewriteRule (.*)$ test.php

上面语句的作用是如果你访问的上一个页面的主机地址是www.test.cn,则无论你当前访问的是哪个页面,都会跳转到对test.php的访问。

再比如,也可以利用 HTTP_REFERER 防倒链,就是限制别人网站使用我网站的图片。

RewriteCond %{HTTP_REFERER} !^$ [NC]

RewriteCond %{HTTP_REFERER} !ww.iyangyi.com [NC]

RewriteRule \.(jpg|gif) http://image.baidu.com/ [R,NC,L]

NC nocase的意思,忽略大小写。第一句呢,是必须要有域名,第一句就是看域名如果不是 www.iyangyi.com 的,当访问.jpg或者.gif文件时候,就都会自动跳转到 http://image.baidu.com/ 上,很好的达到了防盗链的要求。

REQUEST_FILENAME 
这个基本是用的最多的,以为url重写是用的最多的,它是匹配当前访问的域名文件,那哪一块属于REQUEST_FILENAME 呢?是url 除了host域名外的。

http://www.rainleaves.com/html/1569.html?replytocom=265

这个url,那么 REQUEST_FILENAME 就是 html/1569.html?replytocom=265

看个例子:

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L]

-d 是否是一个目录. 判断TestString是否不是一个目录可以这样: !-d 
-f 是否是一个文件. 判断TestString是否不是一个文件可以这样: !-f

这两句语句RewriteCond的意思是请求的文件或路径是不存在的,如果文件或路径存在将返回已经存在的文件或路径。一般是这样结合在一起用的。

上面RewriteRule正则的意思是以 room开头的 room/video/123.html 这样子,变成 web/index.php?c=room&a=video&r=123

$1 表示匹配到的第一个参数。

RewriteRule 写法和规则

RewriteRule是配合RewriteCond一起使用,可以说,RewriteRule是RewriteCond成功匹配后的执行结果,所以,它是很重要的。

来看一下 RewriteRule的写法:

RewriteRule Pattern Substitution [flags]

Pattern是一个正则匹配。Substitution是匹配的替换 [flags]是一些参数限制;

我们看几个例子:

RewriteRule ^room/video/(\d+)\.html web/index\.php?c=room&a=video&r=$1 [QSA,NC,L]

意思是 以 room开头的 room/video/123.html 这样子,变成 web/index.php?c=room&a=video&r=123

RewriteRule \.(jpg|gif) http://image.baidu.com/ [R,NC,L]

意思是以为是访问.jpg或者gif的文件,都会调整到 http://image.baidu.com

所以,掌握正则级是关键所在了。以后,我会专门搞一个正则的篇章来学习下。

我们再看看[flags]是什么意思?

因为它太多了。我就挑几个最常用的来说说吧。

[QSA] qsappend(追加查询字符串)的意思,次标记强制重写引擎在已有的替换字符串中追加一个查询字符串,而不是简单的替换。如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。上面那个room的例子,就必须用它。

NC nocase(忽略大小写)的意思,它使Pattern忽略大小写,也就是在Pattern与当前URL匹配时,"A-Z"和"a-z"没有区别。这个一般也会加上,因为我们的url本身就不区分大小写的。

R redirect(强制重定向)的意思,适合匹配Patter后,Substitution是一个http地址url的情况,就调整出去了。上面那个调整到image.baidu.com的例子,就必须也用它。

L last(结尾规则)的意思,就是已经匹配到了,就立即停止,不再匹配下面的Rule了,类似于编程语言中的break语法,跳出去了。

其他的一些具体的语法,可以参考以下资料

apache rewrite 规则的更多相关文章

  1. HTTP POST请求的Apache Rewrite规则设置

    最近自测后端模块时有个业务需求需要利用WebServer(我用的是Apache)将HTTP POST请求转发至后端C模块,后端处理后返回2进制加密数据.http post请求的url格式为:     ...

  2. Apache Rewrite 规则详解

    在开篇之前: 我想说这篇文章其实是我刚刚接触Rewrite的时候学习的文档,应属转载,但是在这里我不想写明原地址,原因是文章中大多数给出的配置命令经实验都是错误的.需要原文的可以在谷歌上搜索一下&qu ...

  3. Apache Rewrite规则详解

    参考链接:http://slj.me/2009/04/apache-rewrite-regular/ 1.Rewrite规则简介 Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Pe ...

  4. Apache Rewrite规则详解[转]

    1.Rewrite规则简介:Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.htaccess)两种方式.如果要想用 ...

  5. .htaccess中的apache rewrite规则写法详解

    .htaccess中的apache rewrite写法: 1 RewriteEngine On 2 RewriteCond %{HTTP_HOST} ^(www\.)?xxx\.com$ 3 Rewr ...

  6. Apache Rewrite 规则详解知识大全

    Rewrite是一种服务器的重写脉冲技术,它可以使得服务器可以支持 URL 重写,是一种最新流行的服务器技术.它还可以实现限制特定IP访问网站的功能. 1.Rewrite标志 R[=code](for ...

  7. .htaccess中的apache rewrite规则写法详解(未完)

    转:http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html http://blog.csdn.net/Long_Xiao_Yun/ ...

  8. Nginx与Apache的Rewrite规则的区别

    一.Nginx Rewrite规则相关指令 Nginx Rewrite规则相关指令有if.rewrite.set.return.break等,其中rewrite是最关键的指令.一个简单的Nginx R ...

  9. Apache Rewrite url重定向功能的简单配置

    http://www.jb51.net/article/24435.htm 1.Apache Rewrite的主要功能 就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则表达式规范.平时帮助我 ...

随机推荐

  1. string用scanf读入printf输出(节省时间)

    #include <iostream> #include <stdio.h> #include <string.h> using namespace std; in ...

  2. http bass

    1.http 是超文本传输协议,是从万维网服务器传输超文本到本地浏览器的传输协议 2.http是一个基于tcp/ip通信协议来传输数据(html,图片,查询结果等) 3.一个完整的http请求包含7个 ...

  3. PAT 1013 Battle Over Cities

    1013 Battle Over Cities (25 分)   It is vitally important to have all the cities connected by highway ...

  4. Linux下切换使用两个版本的JDK

    Linux下切换使用两个版本的JDK 我这里原来已经配置好过一个1.7版本的jdk. 输出命令: java -version [root@hu-hadoop1 sbin]# java -version ...

  5. 整合Spring Security(二十七)

    在这一节,我们将对/hello页面进行权限控制,必须是授权用户才能访问.当没有权限的用户访问后,跳转到登录页面. 添加依赖 在pom.xml中添加如下配置,引入对Spring Security的依赖. ...

  6. javascript 多个onclick function 取对应值

    方法1: 直接获取值 <button onclick="aa(1)">执行</button> <button onclick="aa(2)& ...

  7. 逆袭之旅DAY17.东软实训.Oracle.PLSQL.过程,函数,包,练习

    2018-07-13 14:54:46 --1.创建一个包,包含一个为雇员加薪的过程,一个为雇员减薪的过程 CREATE OR REPLACE PACKAGE pac_test1 IS PROCEDU ...

  8. shell shell基本概述

    SHELL的概念 SHELL是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序, 用户可以用shell来启动,挂起,停止甚至是编写一些程序. ​ Shell还是 ...

  9. Win10系列:VC++绘制位图图片

    在使用Direct2D绘制图片的过程中,通过IWICImagingFactory工厂接口来得到绘制图片所需要的资源.本小节将介绍如何通过IWICImagingFactory工厂接口得到这些资源,并使用 ...

  10. C++解析四-友员函数、内联函数、静态成员

    友元函数 类的友元函数是定义在类外部,但有权访问类的所有私有(private)成员和保护(protected)成员.尽管友元函数的原型有在类的定义中出现过,但是友元函数并不是成员函数.友元可以是一个函 ...