关于httpd.conf的一点随笔

时间:2020-12-31 16:55:17
假设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,页面会报错。