全面汇总关于Apache在更改配置之后报告403错误的解决方法

blogdaren 2014-06-11 2评论 4813人次

关于本文

本文旨在分享关于Apache在更改DocumentRoot或新增虚拟目录之后出现403错误各种可能:

1、浏览器中显示: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才会生效;
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、上网搜索时,不要一味使用一套关键词,而是多多更换可能的词汇来搜索,会有意外惊喜!


版权声明:除非注明,本文由( blogdaren )原创,转载请保留文章出处。

本文链接:全面汇总关于Apache在更改配置之后报告403错误的解决方法

用户评论:

fijdemon
2016-08-07 10:41
非常感谢,您说的selinux权限设置这个不太可能会用的东西解决我的大问题了!
2016-04-28 15:38
非常感谢,在网上查了一大圈,终于在这里搞定,十分感谢!

发表评论:

您的昵称:
电子邮件:
个人主页: