zoukankan      html  css  js  c++  java
  • apache的虚拟域名rewrite配置以及.htaccess的使用。

    在web服务器领域,Apache基本上是一统天下的,虽然现在越来越多的人转向nginx的,但是仍然由于apache的高性能以及强大的功能,还是大多数服务器在使用Apache。

    apache的安装就先不说了。今天主要来说Apache的虚拟域名功能以及对应的rewrite配置

     

    配置虚拟域名

    啥是虚拟主机呢?就是说把你自己的本地的开发的机子变成一个虚拟域名,比如:你在开发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 这句前面的 注释 # 去掉

    2 . 配置下这个 httpd-vhosts.conf 文件,这个文件就在当前httpd.conf配置文件所在的目录的子目录/extra/下,window和linux 差不多稍有不同

    文件里面有几个例子,我们先搞一个,其实很简单。

     
    1. NameVirtualHost *:80
    2. <VirtualHost *:80>
    3. DocumentRoot "D:/wamp/www/pptv_trunk"
    4. ServerName www.pptv.com
    5. <Directory "D:/wamp/www/pptv_trunk>
    6. Options Indexes FollowSymLinks
    7. AllowOverride All
    8. Order allow,deny
    9. Allow from all
    10. </Directory>
    11. </VirtualHost>

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

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

    windows 在 C:WindowsSystem32driversetc 目录下 
    linux 在 /etc/hosts 目录下。

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

     
    1. 127.0.0.1 pptv.com www.pptv.com

    4 . 打开浏览器访问 www.pptv.com 那么就会定位到刚才的 D:/wamp/www/pptv_trunk项目了。和本地开发一模一样。 
    5 . 如果想切换到其他的环境,只需要修改hosts文件就可以了:

    内侧环境 192.168.100.104 www.pptv.com pptv.com

    预发布环境 112.123.132.33 www.pptv.com pptv.com

    生产线上就用#注释掉,不需要绑定,就切换到线上环境了。

     

    虚拟域名VirtualHost配置详解

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

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

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

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

    看这样是不是舒服多了也更加简洁。

    那么如何配置呢?还是得回到咱们刚才的 httpd-vhosts.conf 这个文件,所有的配置都在这个文件当中来完成。

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

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

     
    1. NameVirtualHost *:80
    2. <VirtualHost *:80>
    3. DocumentRoot "D:/wamp/www/testphp/"
    4. ServerName php.iyangyi.com
    5. ServerAlias www.pptv.cn #可省略
    6. ServerAdmin stefan321@qq.com #可省略
    7. ErrorLog logs/dev-error.log #可省略
    8. CustomLog logs/dev-access.log common #可省略
    9. ErrorDocument 404 logs/404.html #可省略
    10. <Directory "D:/wamp/www/testphp/">
    11. Options Indexes FollowSymLinks
    12. AllowOverride All
    13. Order Allow,Deny
    14. Allow from all
    15. RewriteEngine on
    16. RewriteCond %{REQUEST_FILENAME} !-d
    17. RewriteCond %{REQUEST_FILENAME} !-f
    18. RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
    19. </Directory>
    20. </VirtualHost>

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

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

     
    1. <VirtualHost *:80>
    2. ***
    3. </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的内容:

    404.html 的内容:
    
    404啊这是没找到页面啊傻逼
    

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

    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规则都是在里面完成。所以这个是很重要的。

    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语法,跳出去了。

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

    http://www.skygq.com/2011/02/21/apache%E4%B8%ADrewritecond%E8%A7%84%E5%88%99%E5%8F%82%E6%95%B0%E4%BB%8B%E7%BB%8D%E8%BD%AC/

    http://www.2cto.com/os/201201/116040.html

    http://www.cnblogs.com/adforce/archive/2012/11/23/2784664.html

     

    .htaccess文件的使用

    .htaccess文件是啥呢?我们前面说了这么多的配置和修改,都是针对于apache的配置文件来修改的。.htaccess文件就是它的一个替代品。为啥呢?因为你每次修改apache的配置文件,都必须重启apache服务器,很麻烦不说,有些共享apache的服务器,你还没权限修改和重启apache。所以,.htaccess文件就应运而生了。

    .htaccess分布式配置文件。它文件名字比较奇怪,没有文件名,只有一个文件后缀就是.htaccess。所以一般在windows下还没法新建这个文件,因为windows不允许文件名是空的,比较蛋疼。但是我相信你总归会有办法新建这个文件的。

    .htaccess同时是一个针对目录的配置,你可以把它放到项目的根目录下,那么它就多整个项目其效果,如果你把它放到一个单独的子目录下,那么它就对这个子目录其效果了。

    .htaccess文件如何生效呢。上面讲配置的时候,我讲过了AllowOverride All这个配置,它就是启动.htaccess文件是否可以使用的。AllowOverrideAll表示可以。AllowOverride None表示禁止使用。还是蛮简单的。

    那.htaccess文件里的语法是怎么写额呢?

    其实和上面说的一模一样的写法。可以完全的搬过来用。没问题。

     <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>
    

    上面的apache的<Directory>里的这一块就可以完全的搬到.htaccess文件中来,且效果一模一样。

     

    原文:https://www.zybuluo.com/phper/note/73726

  • 相关阅读:
    单例模式
    HashSet、LinkedHashSet、SortedSet、TreeSet
    ArrayList、LinkedList、CopyOnWriteArrayList
    HashMap、Hashtable、LinkedHashMap
    andrew ng machine learning week8 非监督学习
    andrew ng machine learning week7 支持向量机
    andrew ng machine learning week6 机器学习算法理论
    andrew ng machine learning week5 神经网络
    andrew ng machine learning week4 神经网络
    vue组件监听属性变化watch方法报[Vue warn]: Method "watch" has type "object" in the component definition. Did you reference the function correctly?
  • 原文地址:https://www.cnblogs.com/showcase/p/10935559.html
Copyright © 2011-2022 走看看