• 关于httpd.conf的一点随笔


    假设httpd.conf里的 DocumentRoot 为  DocumentRoot "D:/Apache3W"
    使用<Directory>指令设置url重写,在httpd.conf写如下内容
    <Directory "D:/Apache3W">
    RewriteEngine on
        RewriteRule ^([^\.]+)$ $1.php
    Options Indexes FollowSymLinks  
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    <Directory "D:/Apache3W/phplearn">
    #如果这里什么都不写,也会应用url重写设置,因为D:/Apache3W/phplearn是D:/Apache3W的子目录,所以此目录指令的设置会继承它父目录的指令设置,如果此目录不想重写url,必须在这里
    显式指定:RewriteEngine off
    #如果在这里写 RewriteEngine on 但是指定 RewriteRule  ,则此目录也不能实现url重写,因为RewriteEngine on覆盖了父目录的url重写设置,导致父目录的RewriteRule失效
    </Directory>
    使用.htaccess文件设置url重写,httpd.conf中指定如下内容:
    <Directory "D:/Apache3W">
    Options Indexes FollowSymLinks  
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
    <Directory "D:/Apache3W/phplearn">
    </Directory>
    在D:/Apache3W建立.htaccess文件,内容如下:
    RewriteEngine on
    RewriteRule ^([^\.]+)$ $1.php
    则D:/Apache3W和D:/Apache3W/phplearn都实现了url重写
    在D:/Apache3W/phplearn建立.htaccess文件,内容如下:
    RewriteEngine off
    则只有D:/Apache3W实现了url重写
    改变D:/Apache3W/phplearn的</Directory>指令如下:
    <Directory "D:/Apache3W/phplearn">
    AllowOverride None
    </Directory>
    发现D:/Apache3W/phplearn又实现了url重写,这是因为D:/Apache3W/phplearn禁用了.htaccess文件,则D:/Apache3W/phplearn会继承其上一层目录的.htaccess文件

    零零散散:
    1.设置所有到test目录都允许访问
    <Directory ~ "/test/">   
        Order deny,allow
        Allow from all   
    </Directory>

    这里不能写成<Directory ~ "/test$">  或者 <Directory ~ "/test[\s\S]*$">,否则找不到匹配到文件夹导致权限不起作用,不知道为什么,所有以正则匹配到<Directory>如果正则以$结尾,就找不到匹配

    2.<Directory> 的正则匹配和通配符匹配里设置url重写指令无效,还会破坏本来已经实现的url重写,例如:

    <Directory /usr/dev/apache3w/*>     
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory>
    或者 
    <Directory ~ "/test/">    
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory>

    发现无法对/usr/dev/apache3w/test目录下的文件进行url重写,如果需要使用url重写,则必须要使用完整路径,如

    <Directory /usr/dev/apache3w/test> 
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory>
    且在<Directory> 的正则匹配和通配符匹配里设置url重写不仅无效,还会覆盖已经有效的url重写,例如:

    (1)Directory通配符匹配中设置url重写,如果其顺序在有效的url重写设置以后   

    <Directory /usr/dev/apache3w/test> 
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory>
    <Directory /usr/dev/apache3w/*> 
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory> 

    (2) Directory正则匹配中设置url重写(注意,Directory的正则匹配也可以不加引号)

    <Directory ~ /test/> 
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory>
    <Directory /usr/dev/apache3w/test> 
        RewriteEngine On
        RewriteRule   ^(\w+)\.?(?:\w+)?$ $1.php
    </Directory>


    3.Files指令
    Files指令提供了基于文件名的访问控制,优先级在<Directory>段和.htaccess文件被处理之后,但在<Location>段之前
    例如
    <Files ~ \.php$>

            Deny from all
    </Files>

    表示所有的php文件被拒绝访问

    <Directory "/usr/dev/apache3w/test2/test">   
        <Files index.php>
            Deny from all
        </Files>
    </Directory> 

    表示只有/usr/dev/apache3w/test2/test/index.php被拒绝访问,但是同目录下到其他php文件却可以被访问

    4.配置多个网站
    (1)不同端口多个网站
    Listen 80
    Listen 81
    <VirtualHost *:80>
        ServerAdmin lx@qq.com
        DocumentRoot "D:/Apache3W"
        ErrorLog logs/81-error_log.log
        TransferLog logs/81-access_log.log
    </VirtualHost>
    <VirtualHost *:81>
        ServerAdmin lx@qq.com
        DocumentRoot "D:/Apache3W_81"
        ErrorLog logs/81-error_log.log
        TransferLog logs/81-access_log.log    
    </VirtualHost>

    (2)同一端口多个网站
    Listen 80
    NameVirtualHost *:80
    <VirtualHost *:80>
        ServerAdmin lx@qq.com
        ServerName a.lexun.com
        DocumentRoot "D:/Apache3W"
        ErrorLog logs/a.test.com-error_log.log
        TransferLog logs/a.test.com-access_log.log
    </VirtualHost>
    <VirtualHost *:80>
        ServerAdmin lx@qq.com
        ServerName b.lexun.com
        DocumentRoot "D:/Apache3W_81"
        ErrorLog logs/b.test.com-error_log.log
        TransferLog logs/b.test.com-access_log.log  
    </VirtualHost>

    5.关于AddHandler和AddType(一个是指定服务器用什么处理器处理请求的资源,一个是指定客户端浏览器的mime类型)
    假设AddHandler和AddType都是设置在server config ,且没有被子级所覆盖
    (1)
    AddHandler application/x-httpd-php .php  
    AddType image/jpg .php
    结果:
    AddHandler 的值优先级较高,所以访问  localhost/index.php  会正常解析php

    (2)
    AddHandler image/jpg .php
    结果:
    Response的Header有如下标头:Content-Type:text/plain
    由于服务器找不到.php的处理器,所以会将php文件当做原始txt脚本输出

    (3)
    AddType image/jpg .php
    结果:
    Response的Header有如下标头:Content-Type:image/jpg
    服务器会将php当做原始txt文本输出,但是由于.php不是jpg图片类型,而用Firefox浏览localhost/index.php,则会有如下提示:图像

    “http://localhost/index.php” 因其本身有错无法显示。

    (4)
    AddHandler image/jpg .php  
    AddType image/jpg .php
    结果:
    Response的Header有如下标头:Content-Type:image/jpg
    和(3)一样,这是因为AddHandler虽然优先级高一点,但是由于找不到image/jpg的处理器而使用文本处理器,所以会被后面的AddType image/jpg .php覆盖掉

    提示:以上结果每次更改httpd.conf重启服务器后,最好浏览器清空缓存,关闭标签,再打开页面浏览。

    分别以module、FastCgi、Cgi三种方式运行PHP的配置(测试环境:Win7+Apache2.2+PHP5.3.5)


    #use apache module  

    #LoadModule php5_module "D:\dev\php_5.3.5\php5apache2_2.dll"
    #AddHandler application/x-httpd-php .php
    #PHPIniDir "D:\dev\php_5.3.5"


    #use fastcgi
    #LoadModule fcgid_module modules/mod_fcgid.so  
    #FcgidInitialEnv PHPRC        "D:\dev\php_5.3.5" 
    #AddHandler fcgid-script .php  
    #FcgidWrapper "D:\dev\php_5.3.5\php-cgi.exe" .php  

    #use cgi 注意:此处要使用 / 而不是 \ 否则会出现如下错误(假设访问 http://localhost/index.php): The requested URL /php/php-cgi.exe/index.php was not found on this server 

    ScriptAlias /php/ "D:/dev/php_5.3.5/"
    AddType application/x-httpd-php .php
    Action application/x-httpd-php "/php/php-cgi.exe"

    使用cgi模式配合ScriptAlias的例子

    1.在httpd.conf按上述方式配置为cgi模式 

    2.在 D:/dev/php_5.3.5/ 建立test.php,内容如下:

    #!D:/dev/php_5.3.5/php-cgi.exe 
    <?php
        echo 'hello world';
    ?>

    3.更改php.ini: cgi.force_redirect = 0 

    4.重启Apache 

    然后访问http://localhost/php/test.php,页面正常执行。如果去掉#!D:/dev/php_5.3.5/php-cgi.exe  这个声明或者php.ini中的cgi.force_redirect 不等于0,页面会报错。
     

  • 相关阅读:
    题目:有一对兔子,从出生第三个月起每个月都生一对兔子,小兔子长到第三个月后,每个月又生一对兔子,假如兔子都不死,问M个月时兔子的数量,M为键盘读入的正整数。(请用java语言作答)
    无聊游戏随笔--学院篇
    Java数组冒泡,选择,插入三种常用排序法及自带的快速排序法
    js写年月日三级下拉列表框
    查询避免Unknown column ‘xxx’ in ‘where clause’
    MyEclipse运行web程序报错,先检查这几点!
    Servlet开发之中线程安全问题
    取消Eclipse等号、分号、空格代码自动补全
    try/catch、finally语句的执行顺序测试
    02-MySQL双机热备的搭建
  • 原文地址:https://www.cnblogs.com/mxw09/p/2154240.html
Copyright © 2020-2023  润新知