• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 将URL映射到文件系统位置

    文档根

    在确定要为给定请求提供服务的文件时,httpd的默认行为是获取请求的URL路径(主机名和端口后面的URL部分)并将其添加到DocumentRoot配置文件中指定的末尾。因此,DocumentRoot构成基本文档树下的文件和目录将从Web上可见。

    例如,如果DocumentRoot设置为,/var/www/html则对的请求http://www.example.com/fish/guppies.html将导致文件/var/www/html/fish/guppies.html被提供给发出请求的客户端。

    如果请求了目录(即,以结尾的路径/),则该DirectoryIndex指令所定义的内容是从该目录提供的文件。例如,如果DocumentRoot设置如上,您将设置:

    DirectoryIndex index.html index.php
    

    然后对的请求http://www.example.com/fish/将使httpd尝试提供该文件/var/www/html/fish/index.html。如果该文件不存在,则接下来将尝试提供该文件/var/www/html/fish/index.php

    如果这些文件都不存在,则下一步是尝试提供目录索引(如果mod_autoindex已加载并配置为允许该目录)。

    httpd还具有“虚拟主机”功能,该服务器可以在其中接收多个主机的请求。在这种情况下,DocumentRoot可以为每个虚拟主机指定一个不同的名称,或者mod_vhost_alias可以使用模块提供的指令根据请求的IP地址或主机名动态确定从何处提供内容。

    DocumentRoot指令在您的主服务器配置文件(httpd.conf)中设置,并且可能在您创建的每个其他虚拟主机中设置一次。

    DocumentRoot外部的文件

    在很多情况下,有必要允许通过Web访问文件系统严格不在文件系统下方的部分DocumentRoot。httpd提供了几种不同的方法来实现此目的。在Unix系统上,符号链接可以将文件系统的其他部分置于之下DocumentRoot。出于安全原因,仅当Options相关目录的设置包括FollowSymLinks或时,httpd才会跟随符号链接SymLinksIfOwnerMatch

    另外,该Alias指令会将文件系统的任何部分映射到Web空间。例如,

    Alias "/docs" "/var/web"
    

    该网址http://www.example.com/docs/dir/file.html将从提供/var/web/dir/file.html。该ScriptAlias指令以相同的方式工作,其附加效果是将位于目标路径上的所有内容都视为CGI脚本。

    对于需要更多灵活性的情况,可以使用AliasMatchScriptAliasMatch指令执行强大的基于正则表达式的匹配和替换。例如,

    ScriptAliasMatch "^/~([a-zA-Z0-9]+)/cgi-bin/(.+)"   "/home/$1/cgi-bin/$2"
    

    会将请求映射http://example.com/~user/cgi-bin/script.cgi到路径/home/user/cgi-bin/script.cgi,并将生成的文件视为CGI脚本。

    用户目录

    传统上,在Unix系统上,特定用户的主目录可以称为~user/。该模块mod_userdir通过允许使用以下URL来访问每个用户主目录下的文件,将这一思想扩展到了网络。

    http://www.example.com/~user/file.html
    

    出于安全原因,从Web直接访问用户的主目录是不合适的。因此,该UserDir伪指令指定了用户主目录下Web文件所在的目录。使用默认设置Userdir public_html,以上URL映射到目录中的文件,如中指定的用户主目录/home/user/public_html/file.html所在/home/user/的目录/etc/passwd

    Userdir您还可以在/etc/passwd不包含主目录位置的系统上使用该指令的其他几种形式。

    有些人发现“〜”符号(通常在网络上编码为%7e)很尴尬,并且喜欢使用替代字符串来表示用户目录。mod_userdir不支持此功能。但是,如果以常规方式构造用户的主目录,则可以使用该AliasMatch指令来实现所需的效果。例如,要http://www.example.com/upages/user/file.html映射到/home/user/public_html/file.html,请使用以下AliasMatch指令:

    AliasMatch "^/upages/([a-zA-Z0-9]+)(/(.*))?$"   "/home/$1/public_html/$3"   
    

    URL重定向

    上一节中讨论的配置指令告诉httpd从文件系统中的特定位置获取内容,并将其返回给客户端。有时,最好改为通知客户端所请求的内容位于其他URL,并指示客户端使用新URL发出新请求。这称为重定向,由Redirect指令实现。例如,如果目录的内容/foo/DocumentRoot被移动到新的目录/bar/,可以指示客户在新的位置请求内容如下:

    Redirect permanent "/foo/"   "http://www.example.com/bar/"
    

    这会将所有以URL开头的URL-Path重定向/foo/www.example.com服务器上相同的URL路径(用/bar/代替)/foo/。您可以将客户端重定向到任何服务器,而不仅仅是原始服务器。

    httpd还RedirectMatch为更复杂的重写问题提供了指令。例如,要将网站首页的请求重定向到其他站点,而又不理会所有其他请求,请使用以下配置:

    RedirectMatch permanent "^/$"    "http://www.example.com/startpage"
    

    或者,要将一个站点上的所有页面临时重定向到另一站点上的特定页面,请使用以下命令:

    RedirectMatch temp ".*"  "http://othersite.example.com/startpage"
    

    反向代理

    httpd还允许您将远程文档带入本地服务器的URL空间。这种技术称为反向代理,因为Web服务器通过从远程服务器中获取文档并将其返回给客户端来像代理服务器一样工作。它与常规(正向)代理不同,因为对于客户端来说,文档似乎来自反向代理服务器。

    在下面的示例中,当客户端在/foo/目录下请求文档时,服务器将从/bar/目录中的那些文档中获取这些文档internal.example.com,并将它们像从本地服务器一样返回给客户端。

    ProxyPass "/foo/" "http://internal.example.com/bar/"
    ProxyPassReverse "/foo/" "http://internal.example.com/bar/"
    ProxyPassReverseCookieDomain internal.example.com public.example.com
    ProxyPassReverseCookiePath "/foo/" "/bar/"  
    

    ProxyPass配置服务器,以获取相应的文件,而ProxyPassReverse指令重写重定向起源于internal.example.com让他们针对本地服务器上相应的目录。同样,后端服务器设置的ProxyPassReverseCookieDomainProxyPassReverseCookiePath重写cookie。

    重要的是要注意,但是,文档内部的链接不会被重写。因此,任何绝对链接internal.example.com都将导致客户端脱离代理服务器并直接向发出请求internal.example.com。您可以使用来修改页面中的这些链接(和其他内容),以便将其提供给客户端mod_substitute

    Substitute "s/internal\.example\.com/www.example.com/i"
    

    为了更复杂地重写HTML和XHTML中的链接,该mod_proxy_html模块也可用。它允许您创建需要重写的URL映射,以便可以处理复杂的代理方案。

    改写引擎

    如果需要更强大的替换功能,则提供的重写引擎mod_rewrite会很有用。该模块提供的指令可以使用请求的特征(例如浏览器类型或源IP地址)来决定从何处提供内容。另外,mod_rewrite可以使用外部数据库文件或程序来确定如何处理请求。重写引擎能够执行上述所有三种类型的映射:内部重定向(别名),外部重定向和代理。详细的mod_rewrite文档中讨论了许多使用mod_rewrite的实际示例。

    文件未找到

    不可避免地,将请求在文件系统中找不到匹配文件的URL。发生这种情况有几个原因。在某些情况下,可能是由于将文档从一个位置移动到另一位置的结果。在这种情况下,最好使用URL重定向来通知客户端资源的新位置。这样,即使资源位于新位置,您也可以确保旧书签和链接将继续起作用。

    导致“找不到文件”错误的另一个常见原因是直接在浏览器中或在HTML链接中意外误入URL。httpd提供了mod_speling可解决此问题的模块(sic)。激活此模块后,它将拦截“找不到文件”错误,并寻找具有相似文件名的资源。如果找到一个这样的文件,则mod_speling将向客户端发送HTTP重定向,以通知其正确的位置。如果找到几个“关闭”文件,则将向客户端显示可用替代项的列表。

    mod_speling的一个特别有用的功能是,它将比较文件名而不考虑大小写。这可以帮助用户不知道URL和unix文件系统区分大小写的系统。但是,除了偶尔进行URL校正外,将mod_speling用于其他任何事情都可能给服务器带来额外的负担,因为每个“不正确”的请求都将跟随URL重定向和来自客户端的新请求。

    mod_dir提供FallbackResource,可用于将虚拟URI映射到真实资源,然后为它们提供服务。这对于mod_rewrite实现“前端控制器”非常有用

    如果所有查找内容的尝试均失败,则httpd将返回带有HTTP状态代码404(找不到文件)的错误页面。该页面的外观由ErrorDocument指令控制,可以按照“自定义错误响应”文档中讨论的灵活方式自定义。

    其他URL映射模块

    可用于URL映射的其他模块包括:

    • mod_actions-根据请求方法或资源MIME类型将请求映射到CGI脚本。
    • mod_dir-提供斜杠到索引文件(例如)的基本映射index.html
    • mod_imagemap-根据用户单击HTML文档中嵌入的图像的位置,将请求映射到URL。
    • mod_negotiation-根据客户的偏好(例如语言或内容压缩)选择合适的文档。

    上篇:日志文件

    下篇:Apache性能优化