一般我们下载一个Apache,如果是非安装版本的话,我们需要在httpd.conf文件中找到Define SRVROOT,将其配置为当前Apache根目录的文件路径!
# 将SRVROOT配置为所在根目录
Define SRVROOT "D:\devGreenSoft\Apache24"
ServerRoot "${SRVROOT}"
相关模块 | 相关指令 |
---|---|
|
|
#在httpd.conf文件中为 所以默认该路径默认值为: Apache根目录/htdocs
DocumentRoot "${SRVROOT}/htdocs"
在决定为给定请求提供什么文件时,httpd的默认行为是获取请求的URL-Path(主机名和端口后面的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
)中设置,并且可能在您创建的每个附加虚拟主机上设置一次。
通常情况下,必须允许Web访问文件系统中严格不在其下的部分DocumentRoot
。httpd提供了几种不同的方法来实现这一目标。在Unix系统上,符号链接可以带来文件系统的其他部分DocumentRoot
。出于安全原因,仅当Options
相关目录的设置包含FollowSymLinks
或时 ,httpd才会遵循符号链接SymLinksIfOwnerMatch
。
或者,该Alias
指令将文件系统的任何部分映射到Web空间。例如,用
Alias "/docs" "/var/web"
该URL 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访问每个用户主目录下的文件,将此想法扩展到Web。
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-Path重定向 /foo/
到www.example.com
服务器上/bar/
替换为的相同URL路径 /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重定向来通知客户端资源的新位置。通过这种方式,即使资源位于新位置,您也可以确保旧书签和链接继续有效。
“找不到文件”错误的另一个常见原因是URL的直接错误输入,无论是直接在浏览器中还是在HTML链接中。httpd提供模块 mod_speling
(原文如此)来帮助解决这个问题。激活此模块后,它将拦截“找不到文件”错误并查找具有类似文件名的资源。如果找到一个这样的文件,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
- 根据客户端首选项(如语言或内容压缩)选择适当的文档。