本文档说明了Apache HTTP Server如何使用请求的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还具有Virtual Hosting功能,该服务器在其中接收多个主机的请求。在这种情况下,DocumentRoot
可以为每个虚拟主机指定一个不同的名称,或者mod_vhost_alias
可以使用模块提供的指令根据请求的IP地址或主机名动态确定从何处提供内容。
该DocumentRoot
指令在主服务器配置文件(httpd.conf
)中设置,并且可能在您创建的每个其他虚拟主机中设置一次。
在多数情况下,有必要允许通过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脚本。
对于需要更多灵活性的情况,可以使用AliasMatch
和ScriptAliasMatch
指令进行功能强大的基于正则表达式的匹配和替换。例如,
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"
上一节中讨论的配置指令告诉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.html"
或者,要将一个站点上的所有页面临时重定向到另一站点上的特定页面,请使用以下命令:
RedirectMatch temp ".*" "http://othersite.example.com/startpage.html"
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
让他们针对本地服务器上相应的目录。同样,
后端服务器设置的
ProxyPassReverseCookieDomain
和ProxyPassReverseCookiePath
重写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映射的其他模块包括:
mod_actions
-根据请求方法或资源MIME类型将请求映射到CGI脚本。mod_dir
-提供斜杠到索引文件(例如)的基本映射index.html
。mod_imagemap
-根据用户单击HTML文档中嵌入的图像的位置,将请求映射到URL。mod_negotiation
-根据客户的偏好(例如语言或内容压缩)选择合适的文档。