首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 操作系统 > UNIXLINUX >

【转】Apache 在更改DocumentRoot,或新增虚拟目录之后出现403异常的解决办法汇总详解(Linux)

2013-12-21 
【转】【原创】Apache 在更改DocumentRoot,或新增虚拟目录之后出现403错误的解决方法汇总详解(Linux)【原创】Apa

【转】【原创】Apache 在更改DocumentRoot,或新增虚拟目录之后出现403错误的解决方法汇总详解(Linux)

【原创】Apache 在更改DocumentRoot,或新增虚拟目录之后出现403错误的解决方法汇总详解(Linux)

【一】关于本文

?

  1. 本文讲述在Linux系统下编译安装Apache之后,自行更改DocumentRoot目录指向后,站点出现403错误,浏览器中显示:Forbidden?You?don't?have?permission?to?access?/?on?this?server.

?

  2. 或者设置虚拟目录后的403错误。

?

  3. Apache的httpd服务已经成功启动,一切看似正常,却显示无权限的问题

?

  4. 查看错误日志,其中出现access?to?/?denied?(filesystem?path?'/usr/local/site/test')?because?search?permissions?are?missing?on?a?component?of?the?path条目

?

  5. 设置虚拟目录后,错误日志出现:client?denied?by?server?configuration:?/usr/local/folder

?

  6. 本文采用系统:Linux?Red?Hat?Enterprise?Linux?6(VMware);?Apache版本:2.2.23

?

  7. Apache安装目录:/usr/local/apache

?

?

【二】错误汇总

?

  1. 首先,已经更改httpd.conf配置文件中的DocumentRoot为"/usr/local/site/test",site目录和test目录使用mkdir建立完成,并在test目录下建立index.html,这时,应该查看httpd.conf中如下一段内容:

?

<Directory?"/usr/local/apache/htdocs">                       
????#                                    ?   
????#?Possible?values?for?the?Options?directive?are?"None","All",     ?    
????#?or?any?combination?of:                            
????#???Indexes?Includes?FollowSymLinks?SymLinksifOwnerMatch?ExecCGI?MultiViews ? 
????#                                      ? 
????#?Note?that?"MultiViews"?must?be?named?*explicitly*?---?"Options?All"   ?  
????#?doesn't?give?it?to?you.                       ?    
????#                                    ?   
????#?The?Options?directive?is?both?complicated?and?important.??Please?see     
????#?http://httpd.apache.org/docs/2.2/mod/core.html#options            
????#?for?more?information.                   ?         
????#                                  ?     
????Options?FollowSymLinks                             

????#                                    ?   
????#?AllowOverride?controls?what?directives?may?be?placed?in?.htaccess?files.   
????#?It?can?be?"All",?"None",?or?any?combination?of?the?keywords:         
????#???Options?FileInfo?AuthConfig?Limit                ?     
????#                                  ?     
????AllowOverride?all                         ?      

????#                                       
????#?Controls?who?can?get?stuff?from?this?server.         ? ?  ?   
????#                                       

#???onlineoffline?tag?-?don't?remove                        
????Order?Deny,Allow                                
????Deny?from?all                  ?               
????Allow?from?127.0.0.1            ?           ?      

</Directory>                 ?          ?        

?

在该段内容中,<Directory?"/usr/local/apache/htdocs">的目录要更改成与DocumentRoot相一致,因为这段direcotory是apache对该目录的访问权限设定,只有设置正确的目录,DocumentRoot才会生效;

(这里不一定需要改,一般是直接更改httpd-vhosts.conf的配置,不直接在httpd.conf改)

?

  2. 同样是在httpd.conf中,在第一条所示片段之前,有这样一段:

?

<Directory?/>                                   
????Options?FollowSymLinks                ?            
????AllowOverride?None                     ?         
????Order?deny,allow                     ?          
????Deny?from?all                                 
</Directory>                       ?            

?

网上有许多文章介绍说,将它之间Deny?from?all修改为Allow?from?all,这是相当不负责任的说法,如果你这么做了,更对不起自己,这是禁止apache对根目录“/”以下所有内容禁止访问的设定,也是网站安全设置中最基本的设置,因为有第一条的片段在这段之后,只开通对应网站根目录的权限就可以了,如果将整个服务器的根目录都开放,一但有人试图上传一段可执行代码在不应该出现的目录里,后果不堪设想....

?

  3. 如果做到这一步,你的apache还是很顽固地403、403,那么,你就应该考虑网站目录的权限问题了,首先是目录的基本权限,apache要求目录具有执行权限,也就是x,而其中要注意的,你的目录树都应该拥有这些权限,目前我设置的是755,网上有文章说705就可以搞定,我还没具体测试,比如我的网站根目录是/usr/local/site/test,那么,你要保证/usr、/usr/local、/usr/local/site、/usr/local/site/test这四个层级的目录都是755权限,而我本人就只注意到最末的子目录test,却忽视了site层级,就悲催地弄了许久....

?

?

????chmod?755?/usr/local/site                 ?          

????chmod?755?/usr/local/site/test                         

?

  小提示:上面这两段命令可以简化成(不过这样设置之后,文件夹中的所有文件都会是755权限,所以请在网站目录内还没有文件时进行此设置):

????chmod?-R?755?/usr/local/site*                ?         

?

?

(补充:我个人分析,apache对DocumentRoot目录的访问应该是以“all”这个用户级别进行的,所以705也好,755也好,都是一个等级,如果你的网站是由PHP生成静态页面的话,还要拥有写权限,也就是说,“all"用户必须是7,当然,出于对服务器安全的角度,你不可以把apache这个用户加入到root组,因为有许多系统级文件对组的要求有所放宽,所以要对DocumentRoot这个目录中各个级别的目录分别进行权限设置,比如只有一部分目录的文件是需要生成的,那么就只将这部分目录设置为可写。)

?

?

  4. 如果你设置的是一个虚拟目录,那么你需要在httpd.conf中定义一个虚拟目录,而且像极了如下的片段:

?

Alias?/folder "/usr/local/folder"                       

<Directory?"/usr/local/folder">                         
????Options?FollowSymLinks                            
????AllowOverride?None                              
????Order?deny,allow                               
????Deny?from?all                   ?             
????Allow?from?127.0.0.1?192.168.1.1                       
</Directory>                                   

?

如果是这一种情况,而且你写得类似我上面的代码,三处folder都是一样一样的,那绝对会是403!怎么解决呢,就是把跟在Alias后面斜杠后面的那串改了,改成什么,不要和虚拟目录的文件夹同名就好,然后我就可以用改过后的虚拟目录访问了,当然,改文件夹也行,只要你不怕麻烦,只要Alias后面的虚拟目录定义字符(红色)和实际文件夹名(黑色)不相同就OK。

?

?

  5. 如果依然是403,那就是selinux在作怪了,于是,你可以把你的目录进行一下selinux权限设置

?

????chcon?-R?-t?httpd_sys_content_t?/usr/local/site   ?             

????chcon?-R?-t?httpd_sys_content_t?/usr/local/site/test??             

?

不过,这一步大多不会发生,但以防万一,我还是写上来了。

?

?

?

【三】结语

?

  1. 在linux系统中,如果希望对某个子目录拥有特定权限,那么它的父目录也应该拥有该权限(根据遇到的问题猜测)

?

  2. 网上也有许多误导性质的文章,阅读和参考的时候,要拥有比较强的分辨能力,否则很容易“误入歧途”

?

  3. 要养成看错误日志的习惯,我本人就是没有这个习惯,才会白白地花掉小半天的时间来处理这样一个小小的错误。Apache的默认错误日志为:/usr/local/apache/logs/error_log

?

  4. 上网搜索时,不要一味使用一套关键词,而是多多更换可能的词汇来搜索,会有意外惊喜!

热点排行