设为首页 收藏本站
查看: 1008|回复: 0

[经验分享] Apache HTTP Server .htaccess文件详解

[复制链接]

尚未签到

发表于 2018-10-22 11:58:47 | 显示全部楼层 |阅读模式
  本篇是对Apache httpd 2.2版.htaccess官方帮助文档的翻译,力求严谨准确
  Apache HTTP Server 教程:.htaccess文件
  .htaccess文件提供了的一种基于每目录进行配置修改的方法。
  .htaccess文件
  相关模块                        相关指令
  core                               AccessFileName
  mod authn file              AllowOverride
  mod authz groupfile     Options
  mod cgi                         AddHandler
  mod include                  SetHandler
  mod mime                     AuthType
  AuthName
  AuthUserFile
  AuthGroupFile
  Require
  如果对主服务器配置文件有访问权限的话,你应该完全避免使用.htaccess文件。使用.htaccess会拖慢你的Apache http服务。任何可以包含在.htaccess文件中的指令最好设置在Directory块中,这样也会起到相同的作用但是会有更好的性能。
  .htaccess文件是什么/如何使用他们
  .htaccess文件(或者叫“分布式配置文件”)提供了一种基于每目录的对配置进行修改的方法。一个包含一个或者多个指令的文件可以放置在特定的文档目录中,同时指令会应用到该目录及该目录的所有子目录。
  注释:
  如果你想将你的.htaccess叫成其它名字,你可以使用 AccessFileName指令来修改该名称。比如,假如你想要把这个文件叫做.config,可以将如下内容放到服务器配置文件中:
  AccessFileName   .config
  通常,.htaccess文件使用和主配置文件相同的语法。你可以在这些.htaccess文件中放入什么内容取决于AllowOverride指令。在策略上,AllowOverride指令指定了哪些在.htaccess文件中发现的指令可以产生作用(英文中使用了be honored,此处应该理解为产生作用,编者注)。如果一个指令允许出现在.htaccess文件中,那么该指令的说明文档将会包含一个Override项目,该项指定了为了这个指令可以在.htaccess文件中被执行,AllowOverride后面应该加上什么样的值。
  比如,如果你查阅AddDefaultCharset指令的说明文档,你会发现该指令可以出现在.htaccess文件中。(看在指令概览中的上下文行(Context line)。)Override行记录的是FileInfo。如此,你至少要有AllowOverride  FileInfo来确保出现在.htaccess文件中的AddDefaultCharset指令会得到执行。
  样例:
  Context: server config,virtual host,directory,.htaccess
  Override: FileInfo
  如果你不确定一个特定的指令是否允许出现在.htaccess文件中,查询指令的说明文档,检查Context行中是否含有“.htaccess”。
  何时使用或者不使用.htaccess文件
  通常情况,仅当你无法访问主服务器配置文件(http.conf编者注)时才使用.htaccess文件。比如,有一种普遍的错误想法,用户认证总应该在.htaccess文件中处理,并且,最近几年,另外一种mod_rewrite类指令必须写进.htaccess文件中的错误认识也出现了。情况根本不是这样。你可以把用户认证配置放在主服务器配置中,实际上,这样处理是首选的方式。同样地,在主配置服务器配置中的mod_rewrite指令在诸多方面也会工作的更好。
  .htaccess文件应该在如下情况中使用,文件内容提供者需要基于每目录的将配置修改到服务器上,但是没有服务器系统的访问权限。在系统管理员不希望做出频繁配置修改的情形中,允许个体用户在.htaccess文件中为其自己做出配置修改就是一件合意的事情。比如,这样的一种真实情况,ISP商总是把多个用户的网站集中到一个单独的机器上,同时希望用户可以更改自己的配置。
  但是,普遍上来说,如果可能的话应该尽力避免使用.htaccess文件。任何考虑放在.htaccess文件中的配置,都可以更有效地配置在主服务器配置文件的章节中。
  避免使用.htaccess文件的主要原因有2个。
  第一个是性能。当AllowOverride设置为允许使用.htaccess文件时,httpd为.htaccess文件每个目录查看每个目录 。如此,允许.htaccess文件会产生性能碰撞,无论你是否实际上使用的它们!而且,.htaccess文件在每次文档请求的时候都会被载入。
  进一步地注意,httpd必须在所有的上层目录查阅.htaccess文件,以便获得其必须应用的全部指令。(See section on how directives are applied.)这样,假如/www/htdocs/example目录中的文件得到请求,httpd必须搜索如下文件:
  /.htaccess
  /www/.htaccess
  /www/htdocs/.htaccess
  /www/htdocs/example/.htaccess
  这样,对于在该目录中每个文件的访问,会有4次额外的文件系统访问,即使每次额外的访问都找不到任何文件。(注意,只有当.htaccess文件对/启用的时候,才会有这种情况,通常情况下都不会做这样的设定。)
  在使用RewriteRule指令的情形中,.htaccess上下文中的正则表达式对指向该目录的每个请求都会重新编译,然而,在主服务器配置环境中的正则表达式只需编译一次同时缓存。此外,表达式的规则自身要更为复杂,每个规则总是伴随每个目录环境和mod_rewrite所带来的限制运作。咨询Rewrite Guide来获得关于这个主题的更多细节。
  第二个考虑是安全。如果你允许用户可以修改服务器配置,这样可能会产生超出你控制的更改所带来的结果。谨慎地考虑是否希望给予用户这样的特权。同样要注意,给予用户更少的权限会导致额外的技术支持请求。确保清晰明了的告知用户已经赋予了他们什么等级的权限。准确地指定AllowOverride要设定的值,把这些值指向有关的说明文档,将在以后解决你的许多迷惑。
  注意,把包含某一指令的.htaccess文件放在目录/www/htdocs/example中和把相同指令放在主服务器配置的Directory章节中是完全等价的。
  在/www/htdocs/example的.htaccess文件:
  在/www/htdocs/example的.htpaccess文件中的内容
  AddType  text/example  .exm
  来自于httpd.conf文件中的部分
  
  AddType  text/example  .exm
  
  但是,将该配置放入服务器配置文件中将降低性能冲突,因为服务器配置文件是在httpd启动时加载一次,而不是每次文件请求时加载。
  可以通过设置AllowOverride指令为none来完全禁止.htpaccess文件的使用:
  AllowOverride  none
  指令是如何应用的
  在.htaccess文件中发现的配置指令应用到该发现该文件的目录,及其所有的子目录。但是,记住重要的一点,在高层的目录中也可能会有.htpasswd文件。指令按照找到的顺序来应用。因而,在某一特定目录中的.htaccess文件能够覆盖目录树中在高一级目录的.htaccess里找到的指令。指令可以覆盖高一级目录中的指令,依次类推,在主服务器配置文件中定义的亦是如此。
  样例:
  在目录/www/htdocs/example1中我们包含如下内容的.htaccess文件:
  Option  +ExecCGI
  (注意,必须设定“AllowOverride Options”以使得.htpaccess文件中的Option指令起作用。)
  在目录/www/htdocs/example1/example2中我们包含如下内容的.htaccess文件
  Option  Includes
  由于第二个.htaccess文件,在目录/www/htdocs/example1/example2中,CGI执行是不被允许的,因为只有Options Includes会期作用,任何之前的设定都会被完全覆盖掉。
  .htaccess同主配置文件的淹没(merging,编者注)
  就像在同配置章节相关说明文档中谈论的那样,.htaccess文件可以覆盖为同样目录配置的章节,但是会被主配置文件中其它类型的章节所覆盖。这种事实可以用来强制某种特定配置,即使是在自由AllowOverride设定的情形下。比如,当允许在.htaccess中做任何设定时,为了组织脚本执行,你可以使用:
  
  AllowOverride  All
  
  
  Options  +IncludesNoExec  -ExecCGI
  
  认证样例
  如果你直接跳转到该说明文档的这个部分来找出如何处理认证,重要的是注意一点。要求你使用.htaccess文件来完善密码认证是一种普遍的错误认识。根本就不是这样。在你的主服务器配置文件中,将认证指令放到章节,完善此项的首选方法,同时,只有当你无法访问主服务器配置文件时才应该使用.htaccess文件。查看以上你应该何时使用和不使用.htaccess文件的讨论内容。
  话虽如此,如果你仍旧认为需要是使用.htaccess文件,如下的配置可能对你有用。
  .htaccess文件内容:
  AuthType  Basic
  AuthName  "Password Required"
  AuthUserFile  /www/passwords/passwd.file
  AuthGroupFile  /www/passwords/group.file
  Require  Group  admins
  注意,AllowOverride  AuthConfig必须生效,以使得这些指令可以起作用。
  请看认证教程以获得更完整的认证和授权方面的讨论。
  服务器端引用样例(Server Side Includes)
  另外一种.htaccess文件的普遍使用是为特定的目录启用服务器端应用功能。这可以使用如下的配置指令来处理,指令需要放在期望目录的.htaccess文件中:
  Options  +Includes
  AddType  text/html  shtml
  AddHandler  server-parsed  shtml
  注意,AllowOverride Options和AllowOverride FileInfo务必全部生效,以便这些指令产生影响。
  请查看SSI教程获得更多完整的服务器端引用的讨论。
  CGI样例
  最后,你可能希望使用.htaccess文件来允许特定目录中的CGI程序的执行。可以使用如下的配置来执行:
  Options  +ExecCGI
  AddHandler  cgi-script  cgi  pl
  或者,如果你希望给定目录下的所有文件都考虑作为cgi程序,可以使用如下配置来处理:
  Options  +ExecCGI
  SetHandler  cgi-script
  注意,AllowOverride Options和AllowOverride FileInfo务必全部生效,以便这些指令产生影响。
  请查看CGI教程获得更多完整的CGI编程和配置的讨论。
  疑难排解
  当把配置指令放到.htaccess文件中时并且没得到期望的效果时,应该是由许多事情出错导致的。
  最普遍的情况,问题是AllowOverride没有按照配置指令应该被考虑执行的那种方式设定。确保没有设定成AllowOverride none,这样会导致文件全局出问题。对此一个不错的测试方法是把垃圾配置放到.htaccess文件中,重新载入页面。如果没有生成服务器错误,那么几乎可以肯定是AllowOverride none产生了影响。
  另一方面,当访问文档时,如果得到了服务器错误信息,检查httpd错误日志。日志很可能告知你,使用在.htaccess文件中的指令没有得到许可。
  [Fri Sep 17 18:43:16 2010] [alert] [client 192.168.200.51] /var/www/html/.htaccess: DirectoryIndex not allowed here
  这条信息指示出要么是你使用了一条在.htaccess文件中未被许可的指令,或者是只不过没有在AllowOverride中为已经使用的指令设置充分的级别。查询该特定指令的说明文档来决定使用样例。
  此外,日志还可能告知你使用指令本身用法时的一些语法错误。
  [Sat Aug 09 16:22:34 2008] [alert] [client 192.168.200.51] /var/www/html/.htaccess: RewriteCond: bad flag delimiters
  在这个案例中,错误信息指向了你所犯的特定语法错误。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-624954-1-1.html 上篇帖子: Linux运维 第四阶段 (三) MySQL的SQL语句 下篇帖子: ADMT3.2域迁移之Server2003至Server2012系列(四)创建林信任关系
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表