• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • .htaccess文件

    htaccess文件

    相关模块相关指令
    • core
    • mod_authn_file
    • mod_authz_groupfile
    • mod_cgi
    • mod_include
    • mod_mime
    • AccessFileName
    • AllowOverride
    • Options
    • AddHandler
    • SetHandler
    • AuthType
    • AuthName
    • AuthUserFile
    • AuthGroupFile
    • Require
    .htaccess如果可以访问httpd主服务器配置文件,则应避免完全使用文件。使用.htaccess文件会降低Apache http服务器的速度。可以在.htaccess文件中包含的任何指令最好在Directory块中设置,因为它具有相同的效果和更好的性能。

    它们是什么/如何使用

    .htaccess文件(或“分布式配置文件”)提供了一种基于每个目录进行配置更改的方法。包含一个或多个配置指令的文件放置在特定的文档目录中,这些指令适用于该目录及其所有子目录。

    注意:

    如果要以其他方式调用.htaccess文件,则可以使用AccessFileName指令更改文件名。例如,如果您希望调用该文件,.config则可以将以下内容放入服务器配置文件中:

    AccessFileName ".config"
    

    通常,.htaccess文件使用与主要配置文件相同的语法。您可以在这些文件中放入的内容由AllowOverride指令决定。该伪指令按类别指定了在.htaccess文件中找到的伪指令。如果.htaccess文件中允许使用伪指令,则该伪指令的文档将包含一个Override节,指定必须允许什么值才能AllowOverride允许该伪指令。

    例如,如果查看该AddDefaultCharset指令的文档,则会发现.htaccess文件中允许使用该指令。(请参见指令摘要中的“上下文”行。)“替代”行显示为FileInfo。因此,您必须至少具有AllowOverride FileInfo.htaccess文件中遵守该指令的权限。

    Example:
    
    Context:	server config, virtual host, directory, .htaccess
    Override:	FileInfo
    

    如果不确定文件中是否允许特定指令.htaccess,请查看该指令的文档,然后在上下文行中检查“.htaccess”。

    何时(不使用).htaccess文件

    通常,仅.htaccess在无权访问主服务器配置文件时才应使用文件。例如,存在一种普遍的误解,即用户身份验证应始终在.htaccess文件中进行,而在最近几年,又出现了另一种误解,即mod_rewrite指令必须在.htaccess文件中进行。这根本不是那么回事。您可以将用户身份验证配置放在主服务器配置中,实际上,这是首选的处理方式。同样,mod_rewrite指令在主服务器配置中的许多方面效果更好。

    .htaccess如果内容提供者需要按目录对服务器进行配置更改,但在服务器系统上没有root用户访问权限,则应使用这些文件。如果服务器管理员不愿意频繁更改配置,则可能希望允许单个用户.htaccess自己对文件进行这些更改。例如,在ISP在一台计算机上托管多个用户站点并希望其用户能够更改其配置的情况下,尤其如此。

    但是,通常.htaccess应尽可能避免使用文件。您可以考虑在.htaccess文件中进行的任何配置,都可以<Directory>在主服务器配置文件中的某个部分中进行同样有效的配置。

    避免使用.htaccess文件的主要原因有两个。

    首先是性能。当AllowOverride设置为允许使用的.htaccess文件,httpd的会看在每个目录中的.htaccess文件。因此,.htaccess无论您是否实际使用文件,允许文件都会导致性能下降!此外,.htaccess每次请求文档时都会加载文件。

    还要注意,httpd必须.htaccess在所有更高级别的目录中查找文件,以便具有必须应用的指令的完整补充。(请参阅有关如何应用指令的部分。)因此,如果从目录中请求文件/www/htdocs/example,则httpd必须查找以下文件:

    /.htaccess
    /www/.htaccess
    /www/htdocs/.htaccess
    /www/htdocs/example/.htaccess
    

    因此,对于该目录之外的每个文件访问,将有4个其他文件系统访问,即使这些文件都不存在。(请注意,只有.htaccess为启用了文件,情况才会如此/,通常情况并非如此。)

    RewriteRule指令而言,在.htaccess上下文中,必须对目录的每个请求重新编译这些正则表达式,而在主服务器配置上下文中,它们将被编译一次并进行缓存。此外,规则本身也更加复杂,因为必须解决每个目录上下文和附带的限制mod_rewrite。有关此主题的更多详细信息,请查阅《重写指南》。

    第二个考虑因素是安全性。您允许用户修改服务器配置,这可能会导致您无法控制的更改。仔细考虑您是否要授予用户此特权。还请注意,为用户提供比他们所需的特权少的特权将导致其他技术支持请求。确保您清楚地告诉用户您所授予的特权级别。确切指定您要设置AllowOverride的内容,然后将其指向相关文档,这可以避免以后造成很多混乱。

    请注意,将.htaccess文件放置在/www/htdocs/example包含指令的目录中并将相同的指令放置<Directory "/www/htdocs/example">在主服务器配置的“目录”部分中完全等效:

    .htaccess归档于/www/htdocs/example

    Contents of .htaccess file in /www/htdocs/example

    AddType text/example ".exm"
    
    <Directory "/www/htdocs/example">
        AddType text/example ".exm"
    </Directory>
    

    但是,将此配置放入服务器配置文件将减少性能影响,因为该配置在httpd启动时加载一次,而不是在每次请求文件时加载。

    .htaccess可以通过将AllowOverride指令设置为来完全禁用文件的使用none

    AllowOverride none 
    

    指令如何应用

    .htaccess文件中找到的配置指令将应用于找到该文件的目录.htaccess及其所有子目录。但是,同样重要的是要记住,.htaccess目录中可能有更高的文件。指令按照找到的顺序应用。因此,.htaccess特定目录中的.htaccess文件可能会覆盖目录树中位于较高位置的文件中的指令。而这些反过来可能在更高的位置或在主服务器配置文件本身中找到了覆盖的指令。

    例:

    在目录中,/www/htdocs/example1我们有一个.htaccess包含以下内容的文件:

    Options +ExecCGI
    

    (注意:您必须有效启用“AllowOverride Options”,才能Options.htaccess文件中使用“”指令。)

    在目录中,/www/htdocs/example1/example2我们有一个.htaccess包含以下内容的文件:

    Options Includes
    

    由于.htaccess该目录中的第二个文件,/www/htdocs/example1/example2不允许CGI执行,因为Options Includes实际上这是有效的,它完全覆盖了可能已经存在的所有较早的设置。

    合并.htaccess与主要配置文件

    如“配置节”文档中所讨论的,.htaccess文件可以覆盖<Directory>相应目录的节,但是将被主配置文件中的其他类型的配置节覆盖。即使存在自由AllowOverride设置,此事实也可用于强制执行某些配置。例如,要防止脚本执行同时允许设置其他任何内容,.htaccess可以使用:

    <Directory "/www/htdocs">
        AllowOverride All
    </Directory>
    
    <Location "/">
        Options +IncludesNoExec -ExecCGI
    </Location>
    

    本示例假定您DocumentRoot/www/htdocs

    认证示例

    如果您直接跳到文档的这一部分以了解如何进行身份验证,那么注意一件事很重要。有一个普遍的误解,认为您必须使用.htaccess文件才能实现密码验证。不是这种情况。将身份验证指令放在<Directory>主服务器配置文件中的某个部分中是实现此目的的首选方法,并且.htaccess仅当您无权访问主服务器配置文件时才应使用文件。有关何时应该使用文件以及不应该使用文件的讨论,请参见上文.htaccess

    话虽如此,如果您仍然认为需要使用.htaccess文件,则可能会发现以下配置可能对您有用。

    .htaccess文件内容:

    AuthType Basic
    AuthName "Password Required"
    AuthUserFile "/www/passwords/password.file"
    AuthGroupFile "/www/passwords/group.file"
    Require group admins
    

    请注意,AllowOverride AuthConfig这些指令必须生效才能生效。

    请参阅身份验证教程,以获取有关身份验证和授权的更完整讨论。

    服务器端包含示例

    .htaccess文件的另一种常见用法是为特定目录启用服务器端包含。这可以通过以下配置指令来完成,这些指令.htaccess位于所需目录中的文件中:

    Options +Includes
    AddType text/html shtml
    AddHandler server-parsed shtml
    

    请注意,AllowOverride Options并且AllowOverride FileInfo必须同时生效,这些指令才能生效。

    请参阅SSI教程,以更全面地讨论服务器端包含。

    重写.htaccess文件中的规则

    RewriteRule.htaccess文件中使用时,请注意每个目录的上下文会稍作更改。特别是,规则被视为相对于当前目录,而不是原始请求的URI。请考虑以下示例:

    # In httpd.conf
    RewriteRule "^/images/(.+)\.jpg" "/images/$1.png"
    
    # In .htaccess in root dir
    RewriteRule "^images/(.+)\.jpg" "images/$1.png"
    
    # In .htaccess in images/
    RewriteRule "^(.+)\.jpg" "$1.png"
    

    .htaccess文档目录中的中,从提供给的值中删除前导斜杠RewriteRule,并在images子目录中将其中/images/删除。因此,您的正则表达式也需要省略该部分。

    有关使用的更多详细信息,请查阅mod_rewrite文档mod_rewrite

    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
    

    在这种情况下,错误消息应特定于您所提交的特定语法错误。