Apache教程
安装
#安装Apache及其扩展包
yum -y install httpd httpd-manual mod_ssl mod_perl mod_auth_mysql
启动、停止、重启
#centos
service httpd start
service httpd stop
service httpd restart
主要的配置文件
配置文件在\etc\httpd
下面,主要的配置文件\etc\httpd\conf\httpd.conf
基本配置
属性名+值 | 意义 |
---|---|
ServerRoot "/your/index" |
Apache安装的目录 |
Listen 80 |
监听的端口,可以开启多个端口 |
Include conf.modules.d/*.conf |
加载文件中的所有模块 |
LoadModule foo_module modules/mod_foo.so |
加载单独模块 |
LoadFile |
和LoadModule 类似,但使用绝对路径 |
User username |
运行时的用户名 |
Group groupname |
运行时的用户组 |
ServerAdmin root@localhost |
管理员的邮件地址 |
ServerName www.example.com:80 |
主站点名称,可以是域名也能是IP,不写时自动配置 |
DocumentRoot "/var/www/html" |
主站点的网页存储位置 |
DirectoryIndex index |
默认索引目录 |
RequestReadTimeout |
允许限制客户端发送请求所花费的时间 |
TimeOut |
传输或接收的延时,大于这个时间SERVER 会断开这个链接 |
KeepAliveTimeout |
等待下一个请求的时间 |
MaxClients |
允许的最大客户个数 |
KeepAlive |
是否允许一个链接同时发出多的请求 |
… |
目录访问权限控制
<Directory "/yourindex">
<Files "private.html">
Require all denied
</Files>
Options FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
#Require all granted #Apache2.2后替换Order
</Directory>
属性名 | 意义 |
---|---|
Directory |
权限配置的容器名(文件系统容器),路径能正则匹配 |
/yourindex |
需要配置权限的目录 |
Files |
指定文件权限,路径能正则匹配 |
Options |
配置在特定目录使用的特性 |
None |
不启用任何额外功能 |
ExecCGI |
在该目录下允许执行CGI脚本 |
FollowSymlinks |
允许指定目录下的文件连接到目录外的文件或目录(在该目录下允许文件系统使用符号连接) |
Indexes |
当用户访问该目录时,如果用户找不到DirectoryIndex 指定的主页文件(例如index.html ),则返回该目录下的文件列表给用户 |
SymLinksIfOwnerMatch |
当使用符号连接时,只有当符号连接的文件拥有者与实际文件的拥有者相同时才可以访问。 |
All |
开启除 MultiViews 之外的所有选项 |
AllowOverride |
允许存在于.htaccess 文件中的指令类型 |
None |
不搜索该目录下的.htaccess 文件 |
All |
在.htaccess 文件中可以使用所有的指令 |
Order |
控制在访问时Allow 和Deny 两个访问规则哪个优先 |
Allow |
允许访问的主机列表(可用域名或子网,例如:Allow from 192.168.0.0/16 ) |
Deny |
拒绝访问的主机列表 |
Order deny,allow |
先检查拒绝,再检查允许,当拒绝与允许有冲突时,允许优先,默认规则为允许 |
Order allow,deny |
先检查允许,再检查拒绝,当允许与拒绝有冲突时,拒绝优先。默认规则为拒绝 |
Require |
测试经过身份验证的用户是否由授权提供者授权,Apache2.2后替换Order |
Require all granted |
允许所有访问请求 |
Require all denied |
拒绝所有访问请求 |
Require ip ip1 ip2 |
只允许来自特定IP或IP段的访问请求,其他请求将被拒绝 |
Require host x.com |
只允许来自特定域名主机的访问请求,其他请求将被拒绝 |
Require not ip ip1 |
拒绝ip1 |
Require not host gov |
拒绝gov |
… |
虚拟主机容器
VirtualHost
<VirtualHost 10.1.2.3:80>
ServerAdmin webmaster@host.example.com
DocumentRoot "/www/docs/host.example.com"
ServerName host.example.com
ServerAlias server server2.example.com server2
ServerAlias *.example.com
UseCanonicalName Off
ErrorLog "logs/host.example.com-error_log"
TransferLog "logs/host.example.com-access_log"
</VirtualHost>
属性名 | 意义 |
---|---|
VirtualHost |
包含一组仅适用于特定虚拟主机的指令 |
ServerAlias |
为主机名创建一个别名 |
ProxyPreserveHost On |
使用传入的主机 HTTP 请求标头进行代理请求 |
ProxyPass "/" "http://192.168.111.2/" |
将远程服务器映射到本地服务器 URL 空间 |
ProxyPassReverse "/" "http://192.168.111.2/" |
调整从反向代理服务器发送的 HTTP 响应标头中的 URL |
ServerPath |
由不兼容的浏览器访问的基于名称的虚拟主机的旧 URL 路径名 |
RewriteRule |
定义重写引擎的规则 |
…. |
在单个 IP 地址上运行多个基于名称的网站
# Ensure that Apache listens on port 80
Listen 80
<VirtualHost *:80>
DocumentRoot "/www/example1"
ServerName www.example.com
# Other directives here
</VirtualHost>
<VirtualHost *:80>
DocumentRoot "/www/example2"
ServerName www.example.org
# Other directives here
</VirtualHost>
多个 IP 地址上的基于名称的主机
Listen 80
# This is the "main" server running on 172.20.30.40
ServerName server.example.com
DocumentRoot "/www/mainserver"
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example1"
ServerName www.example.com
# Other directives here ...
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org
# Other directives here ...
</VirtualHost>
在不同的 IP 地址(例如内部和外部地址)上提供相同的内容
<VirtualHost 192.168.1.1 172.20.30.40>
DocumentRoot "/www/server1"
ServerName server.example.com
ServerAlias server
</VirtualHost>
在不同的端口上运行不同的站点
Listen 80
Listen 8080
<VirtualHost 172.20.30.40:80>
ServerName www.example.com
DocumentRoot "/www/domain-80"
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example.com
DocumentRoot "/www/domain-8080"
</VirtualHost>
<VirtualHost 172.20.30.40:80>
ServerName www.example.org
DocumentRoot "/www/otherdomain-80"
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
ServerName www.example.org
DocumentRoot "/www/otherdomain-8080"
</VirtualHost>
基于IP的虚拟主机
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example1"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org
</VirtualHost>
基于端口和基于 ip 的混合虚拟主机
Listen 172.20.30.40:80
Listen 172.20.30.40:8080
Listen 172.20.30.50:80
Listen 172.20.30.50:8080
<VirtualHost 172.20.30.40:80>
DocumentRoot "/www/example1-80"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.40:8080>
DocumentRoot "/www/example1-8080"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.50:80>
DocumentRoot "/www/example2-80"
ServerName www.example.org
</VirtualHost>
<VirtualHost 172.20.30.50:8080>
DocumentRoot "/www/example2-8080"
ServerName www.example.org
</VirtualHost>
混合基于名称和基于 IP 的虚拟主机
Listen 80
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example1"
ServerName www.example.com
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example2"
ServerName www.example.org
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example3"
ServerName www.example.net
</VirtualHost>
# IP-based
<VirtualHost 172.20.30.50>
DocumentRoot "/www/example4"
ServerName www.example.edu
</VirtualHost>
<VirtualHost 172.20.30.60>
DocumentRoot "/www/example5"
ServerName www.example.gov
</VirtualHost>
一起使用 Virtual_host 和 mod_proxy
<VirtualHost *:*>
ProxyPreserveHost On
ProxyPass "/" "http://192.168.111.2/"
ProxyPassReverse "/" "http://192.168.111.2/"
ServerName hostname.example.com
</VirtualHost>
使用_default_
vhosts
<VirtualHost _default_:80>
DocumentRoot "/www/default80"
# ...
</VirtualHost>
<VirtualHost _default_:*>
DocumentRoot "/www/default"
# ...
</VirtualHost>
将基于名称的虚拟主机迁移到基于 IP 的虚拟主机
Listen 80
ServerName www.example.com
DocumentRoot "/www/example1"
<VirtualHost 172.20.30.40 172.20.30.50>
DocumentRoot "/www/example2"
ServerName www.example.org
# ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/example3"
ServerName www.example.net
ServerAlias *.example.net
# ...
</VirtualHost>
使用 ServerPath 指令
<VirtualHost 172.20.30.40>
# primary vhost
DocumentRoot "/www/subdomain"
RewriteEngine On
RewriteRule "." "/www/subdomain/index.html"
# ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/subdomain/sub1"
ServerName www.sub1.domain.tld
ServerPath "/sub1/"
RewriteEngine On
RewriteRule "^(/sub1/.*)" "/www/subdomain$1"
# ...
</VirtualHost>
<VirtualHost 172.20.30.40>
DocumentRoot "/www/subdomain/sub2"
ServerName www.sub2.domain.tld
ServerPath "/sub2/"
RewriteEngine On
RewriteRule "^(/sub2/.*)" "/www/subdomain$1"
# ...
</VirtualHost>
条件判断容器
If
<If "!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*')">
Require all denied
</If>
属性名 | 意义 |
---|---|
If |
条件满足则执行内部语句 |
!(%{HTTP_REFERER} -strmatch 'http://www.example.com/*') |
条件 |
… |
IfDefine
<IfDefine ClosedForNow>
Redirect / http://otherserver.example.com/
</IfDefine>
属性名 | 意义 |
---|---|
IfDefine |
若使用httpd -D ClosedForNow 指令执行的操作就会执行里面的内容(可镶嵌) |
ClosedForNow |
使用httpd -D ClosedForNow 指令执行,前面加!表示相反 |
Redirect |
跳转到另一站点 |
… |
IfModule
<IfModule mod_mime_magic.c>
MimeMagicFile conf/magic
</IfModule>
属性名 | 意义 |
---|---|
IfModule |
若使用了mod_mime_magic 模块就执行里面内容(可镶嵌) |
mod_mime_magic.c |
模块名 |
MimeMagicFile |
执行的指令 |
… |
IfVersion
<IfVersion >= 2.1>
# this happens only in versions greater or
# equal 2.1.0.
</IfVersion>
属性名 | 意义 |
---|---|
IfVersion |
版本满足就会执行 |
…. |
网站空间容器
Location
<Location "/status">
SetHandler server-status
Require host example.com
</Location>
属性名 | 意义 |
---|---|
Location |
Location 容器内定义的指令仅对特定的 URL 有效 |
/status |
将特定URL映射到mod_status 提供的内部Apache HTTP Server 处理程序 |
… |
Proxy容器
Proxy
<Proxy "http://example.com/foo/*">
SetOutputFilter INCLUDES
</Proxy>
更灵活的匹配容器
DirectoryMatch
<DirectoryMatch "^/www/(.+/)?[0-9]{3}/">
# ...
</DirectoryMatch>
FilesMatch
<FilesMatch ".+\.(gif|jpe?g|png)$">
# ...
</FilesMatch>
LocationMatch
<LocationMatch "^/combined/(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</LocationMatch>
ProxyMatch
<ProxyMatch "^http://(?<sitename>[^/]+)">
Require ldap-group cn=%{env:MATCH_SITENAME},ou=combined,o=Example
</ProxyMatch>
日志模块
通用日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log.log common
组合日志格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log.log combined
%h
是远程主机%l
是由identd确定的用户的身份%u
是HTTP身份验证确定的用户名%t
是服务器处理完请求的时间%r
是来自客户端的请求行GET、HTTP%> s
是从服务器发送到客户端的状态代码%b
是客户端响应的大小(以字节为单位)"%{Referer}i
是链接到此URL的页面%{User-Agent}i
是客户浏览器提供的浏览器识别信息
LogFormat "%400,501{User-agent}i" browserlog
LogFormat "%!200,304,302{Referer}i" refererlog
#前面的状态码是用来判断的
属性名 | 意义 |
---|---|
ErrorLog “xxx” |
定位服务器错误日志的位置,默认使用相对路径 |
LogLevel warn |
日志级别 |
ErrorLogFormat |
设置错误日志的格式 |
CustomLog logs/access_log common |
创建和格式化日志文件common |
LogFormat "%h %l %u %t "%r" %>s %b "%{Referer}i" "%{User-agent}i"" common |
common 为用户日志别名,中间为具体格式 |
TransferLog "logs/host.example.com-access_log" |
创建日志文件 |
… |
附加的配置文件
环境变量
设置环境变量
属性名 | 意义 |
---|---|
unique_id_module |
为每个请求提供一个具有唯一标识符的环境变量 |
PassEnv LD_LIBRARY_PATH |
从 shell 传递环境变量 |
SetEnv SPECIAL_PATH /foo/bin |
设置环境变量 |
UnsetEnv LD_LIBRARY_PATH |
从环境中删除变量 |
SetEnvIf Request_URI "\.(.*)$" EXTENSION=$1 |
根据请求的属性设置环境变量 |
SetEnvIfExpr expr [!]env-variable[=value] [[!]env-variable[=value]] ... |
|
BrowserMatch Robot is_a_robot <br>SetEnvIf User-Agent Robot is_a_robot |
以 HTTP 用户代理为条件设置环境变量 |
SetEnvIfNoCase |
根据请求的属性设置环境变量而不考虑大小写 |
… |
使用环境变量
属性名 | 意义 |
---|---|
Require all granted |
|
CustomLog |
设置日志文件的文件名和格式 |
Allow |
控制哪些主机可以访问服务器的某个区域 |
Deny |
控制哪些主机被拒绝访问服务器 |
ExtFilterDefine |
定义外部过滤器 |
`Header [condition] add | append |
Header set Content-Type "text/plain" "expr=-z %{CONTENT_TYPE}" |
|
RewriteCond TestString CondPattern [flags] |
定义重写发生的条件 |
RewriteRule Pattern Substitution [flags] |
定义重写引擎的规则 |
… |
缓存指南
Sample httpd.conf
#
# Sample Cache Configuration
#
LoadModule cache_module modules/mod_cache.so
<IfModule mod_cache.c>
LoadModule cache_disk_module modules/mod_cache_disk.so
<IfModule mod_cache_disk.c>
CacheRoot "c:/cacheroot"
CacheEnable disk "/"
CacheDirLevels 5
CacheDirLength 3
</IfModule>
# When acting as a proxy, don't cache the list of security updates
CacheDisable "http://security.update.server/update-list/"
</IfModule>
属性名 | 意义 |
---|---|
CacheRoot |
存放缓存文件的根目录 |
CacheDirLength |
子目录名称中的字符数 |
CacheDirLevels |
缓存中子目录的级别数 |
CacheMaxFileSize |
要放置在缓存中的文档的最大大小(以字节为单位) |
CacheReadSize |
在向下游发送数据之前要读取和缓存的文档的最小大小(以字节为单位) |
CacheReadTime |
在向下游发送数据之前读取时应经过的最短时间(以毫秒为单位) |
CacheEnable cache_type [url-string] |
使用指定的存储管理器启用指定 URL 的缓存 |
CacheSocache type[:args] |
要使用的共享对象缓存实现 |
CacheDisable |
禁用指定 URL 的缓存 |
… |
内容协商
使用类型映射文件
AddHandler type-map .var
类型映射文件应与其描述的资源具有相同的名称,后跟扩展名.var
.在下面显示的示例中,资源名为foo
,因此类型映射文件名为foo.var
URI: foo
URI: foo.en.html
Content-type: text/html
Content-language: en
URI: foo.fr.de.html
Content-type: text/html;charset=iso-8859-2
Content-language: fr, de
URI: foo
URI: foo.jpeg
Content-type: image/jpeg; qs=0.8
URI: foo.gif
Content-type: image/gif; qs=0.5
URI: foo.txt
Content-type: text/plain; qs=0.01
URI: document.html
Content-language: en
Content-type: text/html
URI: document.html.en
Content-language: fr
Content-type: text/html
URI: document.html.fr
Content-language: de
Content-type: text/html
URI: document.html.de
这三段代码都是type-map
属性名 | 意义 |
---|---|
URI: document.html |
资源名 |
Content-type |
资源类型 |
Content-language |
资源语言 |
qs |
权重 |
AddHandler type-map .var |
与名为type-map 的处理程序关联 |
.var |
相当* 的匹配值 |
… |
Multiviews
如果服务器收到/some/dir/foo
的请求,如果/some/dir
启用了MultiViews,并且/some/dir/foo
不存在,那么服务器会读取寻找的目录名为foo.*
的文件
从 URL 映射到文件系统
Apache HTTP Server 使用请求的 URL 来确定提供文件的文件系统位置
ProxyPass "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverse "/mirror/foo/" "http://backend.example.com/"
ProxyPassReverseCookieDomain "backend.example.com" "public.example.com"
ProxyPassReverseCookiePath "/" "/mirror/foo/"
属性名 | 意义 |
---|---|
`Alias [URL-path] file-path | directory-path` |
Alias "/docs" "/var/web" |
网址 http://www.example.com/docs/dir/file.html 将从/var/web/dir/file.html 提供 |
`AliasMatch regex file-path | directory-path` |
AliasMatch "^/icons(/$)(.*)" "/usr/local/apache/icons$1$2" |
|
`CheckSpelling on | off` |
DirectoryIndex disabled local-url [local-url] ... |
客户端请求目录时要查找的资源列表 |
DocumentRoot |
|
ErrorDocument 404 /errors/bad_urls.php |
发生错误时服务器将返回给客户端的内容 |
Options |
|
ProxyPass "/mirror/foo/" "http://backend.example.com/" |
将远程服务器映射到本地服务器 URL 空间 |
ProxyPassReverse [path] url [interpolate] |
调整从反向代理服务器发送的 HTTP 响应标头中的 URL |
ProxyPassReverseCookieDomain internal-domain public-domain [interpolate] |
从反向代理服务器调整 Set-Cookie 标头中的域字符串 |
ProxyPassReverseCookiePath internal-path public-path [interpolate] |
调整来自反向代理服务器的 Set-Cookie 标头中的 Path 字符串 |
Redirect [status] [URL-path] URL |
发送外部重定向请求客户端获取不同的 URL |
Redirect 303 "/three" "http://example.com/other" |
|
RedirectMatch [status] regex URL |
根据当前 URL 的正则表达式匹配发送外部重定向 |
RewriteCond TestString CondPattern [flags] |
定义重写发生的条件 |
RewriteRule Pattern Substitution [flags] |
定义重写引擎的规则 |
`ScriptAlias [URL-path] file-path | directory-path` |
`ScriptAliasMatch regex file-path | directory-path` |
UserDir directory-filename [directory-filename] ... |
用户特定目录的位置 |
… |
全局配置
属性名 | 意义 |
---|---|
`ServerName [scheme://]domain-name | ip-address[:port]` |
`ServerAdmin email-address | URL` |
`ServerSignature On | Off |
`ServerTokens Major | Minor |
`UseCanonicalName On | Off |
`UseCanonicalPhysicalPort On | Off` |
CoreDumpDirectory directory |
Apache HTTP Server 在转储核心之前尝试切换的目录 |
DocumentRoot directory-path |
构成 Web 上可见的主文档树的目录 |
`ErrorLog file-path | syslog[:[facility]` |
`Mutex mechanism [default | mutex-name] … [OmitPID]` |
PidFile filename |
服务器记录守护进程进程ID的文件 |
ScoreBoardFile file-path |
用于存储子进程的协调数据的文件的位置 |
ServerRoot directory-path |
服务器安装的基本目录 |
LimitRequestBody bytes |
限制客户端发送的 HTTP 请求正文的总大小 |
LimitRequestFields number |
限制将从客户端接受的 HTTP 请求头字段的数量 |
LimitRequestFieldSize bytes |
限制客户端允许的 HTTP 请求头的大小 |
LimitRequestLine bytes |
限制将从客户端接受的 HTTP 请求行的大小 |
`RLimitCPU seconds | max [seconds |
`RLimitMEM bytes | max [bytes |
`RLimitNPROC number | max [number |
ThreadStackSize size |
处理客户端连接的线程使用的堆栈大小(以字节为单位) |
… |
SSL/TLS 加密
an example
LoadModule ssl_module modules/mod_ssl.so
Listen 443
<VirtualHost *:443>
ServerName www.example.com
SSLEngine on
SSLCertificateFile "/path/to/www.example.com.cert"
SSLCertificateKeyFile "/path/to/www.example.com.key"
</VirtualHost>
属性值 | 意义 |
---|---|
SSLEngine on |
SSL 引擎操作开关 |
`SSLCertificateFile file-path | certid` |
`SSLCertificateKeyFile file-path | keyid` |
SSLCipherSuite [protocol] cipher-spec |
密码套件可用于 SSL 握手中的协商 |
SSLCipherSuite RC4-SHA:AES128-SHA:HIGH:!aNULL:!MD5 |
|
`SSLHonorCipherOrder on | off` |
SSLUseStapling off |
在 TLS 握手中启用 OCSP 响应的装订 |
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)" |
配置 OCSP 装订缓存 |
SSLVerifyClient level |
客户端证书验证类型 |
SSLVerifyDepth number |
客户端证书验证中 CA 证书的最大深度 |
SSLCACertificateFile file-path |
用于客户端身份验证的串联 PEM 编码 CA 证书文件 |
`SSLOptions [+ | -]option …` |
SSLRequire expression |
仅当任意复杂的布尔表达式为真时才允许访问 |
… |
URL重写
属性名 | 意义 |
---|---|
RewriteBase URL-path |
设置每个目录重写的基本 URL |
RewriteCond TestString CondPattern [flags] |
定义重写发生的条件 |
RewriteRule Pattern Substitution [flags] |
定义重写引擎的规则 |
RewriteEngine on|off | 启用或禁用运行时重写引擎 |
RewriteMap MapName MapType:MapSource [MapTypeOptions] | 定义键查找的映射函数 |
RewriteOptions Options | 为重写引擎设置一些特殊选项 |
… |
认证和授权
属性值 | 意义 |
---|---|
AllowOverride AuthConfig |
.htaccess 文件中允许的指令类型 |
`AuthType None | Basic |
AuthBasicProvider provider-name [provider-name] ... |
设置此位置的身份验证提供程序 |
AuthDigestProvider provider-name [provider-name] ... |
设置此位置的身份验证提供程序 |
Require [not] entity-name [entity-name] ... |
测试经过身份验证的用户是否由授权提供者授权 |
AuthName auth-domain |
用于 HTTP 身份验证的授权领域 |
AuthUserFile file-path |
设置包含用于身份验证的用户和密码列表的文本文件的名称 |
AuthDBMUserFile file-path |
设置包含用于身份验证的用户和密码列表的数据库文件的名称 |
AuthGroupFile file-path |
设置包含授权用户组列表的文本文件的名称 |
`AuthLDAPURL url [NONE | SSL |
AuthGroupFile file-path |
设置包含授权用户组列表的文本文件的名称 |
Require valid-user |
所有有效用户都可以访问该资源 |
Require user userid [userid] ... |
只有指定用户才能访问资源 |
Require group group-name [group-name] ... |
只有命名组中的用户才能访问资源 |
<RequireAll> ... </RequireAll> |
附上一组授权指令,其中没有一个必须失败,并且至少一个必须成功才能使封闭指令成功 |
<RequireAny> ... </RequireAny> |
附上一组授权指令,其中一个必须成功才能使封闭指令成功 |
<RequireNone> ... </RequireNone> |
包含一组授权指令,其中没有一个必须成功才能使封闭指令不失败 |
… |
如何工作
htpasswd -c /usr/local/apache/passwd/passwords rbowen
#创建文件
GroupName: rbowen dpitts sungo rshersey
#创建一个将组名与该组中的用户列表关联的组文件
htpasswd /usr/local/apache/passwd/passwords dpitts
#将用户添加到您已存在的密码文件
简单示例
能放在.htaccess
中或者Directory
中
AuthType Basic
AuthName "Restricted Files"
# (Following line optional)
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
Require user rbowen
让不止一个人进来
AuthType Basic
AuthName "By Invitation Only"
# Optional line:
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
AuthGroupFile "/usr/local/apache/passwd/groups"
Require group GroupName
备用密码存储
<Directory "/www/docs/private">
AuthName "Private"
AuthType Basic
AuthBasicProvider dbm
AuthDBMUserFile "/www/passwords/passwd.dbm"
Require valid-user
</Directory>
使用多个提供商
使用文件组授权和 LDAP 组授权
<Directory "/www/docs/private">
AuthName "Private"
AuthType Basic
AuthBasicProvider file
AuthUserFile "/usr/local/apache/passwd/passwords"
AuthLDAPURL ldap://ldaphost/o=yourorg
AuthGroupFile "/usr/local/apache/passwd/groups"
Require group GroupName
Require ldap-group cn=mygroup,o=yourorg
</Directory>
CGI与动态内容
属性名 | 意义 |
---|---|
AddHandler cgi-script .cgi |
将文件扩展名映射到指定的处理程序(指定拓展名.cgi为CGI文件) |
Options ExecCGI |
|
`ScriptAlias [URL-path] file-path | directory-path` |
LoadModule cgi_module modules/mod_cgi.so |
配置 Apache 以允许 CGI 执行 |
`SetHandler handler-name | none |
… |
要允许CGI程序执行用户目录中结束的任何文件。.cgi
<Directory "/home/*/public_html">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
如果您希望指定用户目录的子目录,其中所有内容都将被视为 CGI 程序。cgi-bin`
<Directory "/home/*/public_html/cgi-bin">
Options ExecCGI
SetHandler cgi-script
</Directory>
编写CGI
保存到名为first.pl
的文件中,并将其放在cgi-bin
目录中
#!/usr/bin/perl
print "Content-type: text/html\n\n";
print "Hello, World.";
浏览器输入URL地址
http://www.example.com/cgi-bin/first.pl
反向代理
简单的反向代理
ProxyPass "/images" "http://www.example.com/"
ProxyPassReverse "/images" "http://www.example.com/"
任何以/images
路径开头的请求都被代理到指定的后端,否则它将在本地处理
集群和均衡器
负载均衡和故障转移
<Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/"
均衡器和均衡器成员配置
<Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
ProxySet lbmethod=bytraffic
</Proxy>
ProxyPass "/images" "balancer://myset/"
ProxyPassReverse "/images" "balancer://myset/"
故障转移
<Proxy balancer://myset>
BalancerMember http://www2.example.com:8080
BalancerMember http://www3.example.com:8080 loadfactor=3 timeout=1
BalancerMember http://spare1.example.com:8080 status=+R
BalancerMember http://spare2.example.com:8080 status=+R
BalancerMember http://hstandby.example.com:8080 status=+H
BalancerMember http://bkup1.example.com:8080 lbset=1
BalancerMember http://bkup2.example.com:8080 lbset=1
ProxySet lbmethod=byrequests
</Proxy>
ProxyPass "/images/" "balancer://myset/"
ProxyPassReverse "/images/" "balancer://myset/"
均衡器启用
<Location "/balancer-manager">
SetHandler balancer-manager
Require host localhost
</Location>
属性值 | 意义 |
---|---|
`ProxyPass [path] ! | url [key=value [key=value …]] [nocanon] [interpolate] [noquery]` |
BalancerMember [balancerurl] url [key=value [key=value ...]] |
向负载均衡组添加成员 |
ProxyPassReverse [path] url [interpolate] |
调整从反向代理服务器发送的 HTTP 响应标头中的 URL |
BalancerMember [balancerurl] url [key=value [key=value ...]] |
向负载均衡组添加成员 |
ProxySet url key=value [key=value ...] |
设置各种代理平衡器或成员参数 |
… |
.htaccess文件
和httpd.conf
的语法一样,作用于当前目录,一般用来设置单个功能
处理器
属性名 | 意义 |
---|---|
Action action-type cgi-script [virtual] |
为特定处理程序或内容类型激活 CGI 脚本 |
AddHandler handler-name extension [extension] ... |
将文件扩展名映射到指定的处理程序 |
RemoveHandler extension [extension] ... |
删除一组文件扩展名的任何处理程序关联 |
SetHandler handler-name |
none |
… |
过滤器
属性值 | 意义 |
---|---|
FilterChain [+=-@!]filter-name ... |
配置过滤器链 |
FilterDeclare filter-name [type] |
声明一个智能过滤器 |
FilterProtocol filter-name [provider-name] proto-flags |
声明一个智能过滤器 |
FilterProvider filter-name provider-name expression |
注册内容过滤器 |
AddInputFilter filter[;filter...] extension [extension] ... |
将文件扩展名映射到将处理客户端请求的过滤器 |
AddOutputFilter filter[;filter...] extension [extension] ... |
将文件扩展名映射到将处理来自服务器的响应的过滤器 |
RemoveInputFilter extension [extension] ... |
删除一组文件扩展名的任何输入过滤器关联 |
RemoveOutputFilter extension [extension] ... |
删除一组文件扩展名的任何输出过滤器关联 |
ReflectorHeader inputheader [outputheader] |
将输入标题反映到输出标题 |
ExtFilterDefine filtername parameters |
定义外部过滤器 |
ExtFilterOptions option [option] ... |
配置 mod_ext_filter 选项 |
SetInputFilter filter[;filter...] |
设置将处理客户端请求和 POST 输入的过滤器 |
SetOutputFilter filter[;filter...] |
设置将处理来自服务器的响应的过滤器 |
… |
变量
HTTP变量 |
---|
HTTP_ACCEPT |
HTTP_COOKIE |
HTTP_FORWARDED |
HTTP_HOST |
HTTP_PROXY_CONNECTION |
HTTP_REFERER |
HTTP_USER_AGENT |
名字 | 描述 |
---|---|
REQUEST_METHOD |
传入请求的 HTTP 方法(例如GET ) |
REQUEST_SCHEME |
该计划是请求URI的一部分 |
REQUEST_URI |
请求URI的路径部分 |
DOCUMENT_URI |
和REQUEST_URI 一样 |
REQUEST_FILENAME |
如果当时服务器已经确定了该路径,与请求匹配的文件或脚本的完整本地文件系统路径。否则,例如在虚拟主机上下文中使用时,与 REQUEST_FILENAME REQUEST_URI 相同的值 |
SCRIPT_FILENAME |
和REQUEST_FILENAME 一样 |
LAST_MODIFIED |
如果此时服务器已经确定该格式中文件上次修改的日期和时间,则参照该日期和时间进行引用。20101231235959 LAST_MODIFIED |
SCRIPT_USER |
脚本所有者的用户名。 |
SCRIPT_GROUP |
脚本组的组名。 |
PATH_INFO |
尾随路径名称信息,请参阅AcceptPathInfo |
QUERY_STRING |
当前请求的查询字符串 |
IS_SUBREQ |
如果当前请求是次要请求true ,否则false |
THE_REQUEST |
完整的请求行(例如”GET /index.html HTTP/1.1 “) |
REMOTE_ADDR |
远程主机的 IP 地址 |
REMOTE_PORT |
远程主机的端口(2.4.26 及以后) |
REMOTE_HOST |
远程主机的主机名称 |
REMOTE_USER |
已验证用户的名称(在<IF> 不可用) |
REMOTE_IDENT |
mod_ident 设置的用户名 |
SERVER_NAME |
当前的虚拟ServerName |
SERVER_PORT |
当前vhost的服务器端口,请参阅ServerName |
SERVER_ADMIN |
当前的虚拟ServerAdmin |
SERVER_PROTOCOL |
请求所使用的协议 |
DOCUMENT_ROOT |
当前的虚拟DocumentRoot |
AUTH_TYPE |
配置(例如AuthType basic ) |
CONTENT_TYPE |
响应的内容类型(在 <If> 间不可用) |
HANDLER |
创建响应的处理程序的名称 |
HTTP2 |
如果请求使用http/2on ,否则off |
HTTPS |
如果请求使用httpson ,否则off |
IPV6 |
如果连接使用IPv6on ,否则off |
REQUEST_STATUS |
请求的 HTTP 错误状态(在<If> 间不可用)) |
REQUEST_LOG_ID |
请求的错误日志ID(参见ErrorLogFormat ) |
CONN_LOG_ID |
连接的错误日志ID(参见ErrorLogFormat ) |
CONN_REMOTE_ADDR |
连接的同侪 IP 地址(参见模块)mod_remoteip |
CONTEXT_PREFIX |
|
CONTEXT_DOCUMENT_ROOT |
名字 | 描述 |
---|---|
TIME_YEAR |
本年度(例如2010 ) |
TIME_MON |
当月(,…,0112 ) |
TIME_DAY |
本月的当前日期(,…)01 |
TIME_HOUR |
当前时间的小时部分(,…,0023 ) |
TIME_MIN |
当前时间的分钟部分 |
TIME_SEC |
当前时间的秒钟部分 |
TIME_WDAY |
一周的一天(从周日开始)0 |
TIME |
格式中的日期和时间20101231235959 |
SERVER_SOFTWARE |
服务器版本字符串 |
API_VERSION |
API 版本的日期(模块魔法数字) |
二进制变量
名字 | 其他形式 | 描述 |
---|---|---|
== |
= |
字符串均等 |
!= |
字符串不平等 | |
< |
字符串少于 | |
<= |
字符串小于或等于 | |
> |
字符串大于 | |
>= |
字符串大于或等于 | |
=~ |
字符串与常规表达方式匹配 | |
!~ |
字符串与常规表达不匹配 | |
-eq |
eq |
整数平等 |
-ne |
ne |
整数不平等 |
-lt |
lt |
整数小于 |
-le |
le |
整数小于或相等 |
-gt |
gt |
整数大于 |
-ge |
ge |
整数大于或相等 |
统一变量
名字 | 描述 |
---|---|
-d |
参数被视为文件名。如果文件存在并且是目录,则为真 |
-e |
参数被视为文件名。如果存在文件(或目录和特殊文件),则为真 |
-f |
参数被视为文件名。如果文件存在并且是常规文件,则为真 |
-s |
参数被视为文件名。如果文件存在且不是空的,则正确 |
-L |
参数被视为文件名。如果文件存在并且是符号链接,则为真 |
-h |
参数被视为文件名。真实的,如果文件存在,是符号链接(与-L 相似) |
-F |
如果字符串是一个有效的文件,则可以通过该路径的所有服务器当前配置的访问控制进行访问。 |
-U |
如果字符串是一个有效的URL,则可以通过该路径的所有服务器当前配置的访问控制进行访问。 |
-A |
别名-U |
-n |
如果字符串不是空的,则为真 |
-z |
如果字符串是空的,则为真 |
-T |
如果字符串为空,””,””,”” 或 “”(不区分大小写),则为 False,否则为真 |
-R |
与%{REMOTE_ADDR} -ipmatch ... 相同,但效率更高 |
功能变量
名字 | 描述 |
---|---|
req ,http |
获取 HTTP 请求标题;标头名称可以添加到 Vary 标头 |
req_novary |
与 相同,但不会将标头名称添加到 Vary 标头中 |
resp |
获取 HTTP 响应头(大多数响应标题在<If> 间尚未设置) |
reqenv |
查找请求环境变量(作为快捷方式,也可用于访问变量) |
osenv |
查找操作系统环境变量 |
note |
查找请求说明 |
env |
返回第一个匹配 |
tolower |
将字符串转换为小写 |
toupper |
将字符串转换为大写 |
escape |
在 %hex 编码中转义特殊字符 |
unescape |
Unescape %hex 编码的字符串,单独留下编码的斜杠;如果找到 %00,则返回空字符串 |
base64 |
使用 base64 编码对字符串进行编码 |
unbase64 |
解码base64编码的字符串,如果找到0x00则返回截断的字符串 |
md5 |
使用 MD5 对字符串进行散列,然后使用十六进制编码对散列进行编码 |
sha1 |
使用 SHA1 对字符串进行散列,然后使用十六进制编码对散列进行编码 |
file |
从文件中读取内容(包括行尾,如果存在) |
filemod |
返回文件的最后修改时间(如果文件不存在或不是常规文件,则返回 0) |
filesize |
返回文件的大小(如果文件不存在或不是常规文件,则返回 0) |
模块
核心与多处理模块(MPM)
始终可用的核心 Apache HTTP Server 功能
由多个多处理模块 (MPM) 实现的一组指令
MPM 的一种变体,其目标是仅为与活动处理工作者的连接消耗线程
实现专为 Novell NetWare 优化的线程 Web 服务器的多处理模块
用于 OS/2 的混合多进程、多线程 MPM
实现一个非线程的、预分叉的 Web 服务器
为 Windows NT 优化的多处理模块
实现混合多线程多进程 Web 服务器的多处理模块
其他模块
基于主机(名称或 IP 地址)的组授权
根据媒体类型或请求方法执行 CGI 脚本
提供在文档树中映射主机文件系统的不同部分和 URL 重定向
轻松限制可以在服务器上使用的 HTTP 方法
发送包含自己的 HTTP 标头的文件
基本 HTTP 身份验证
使用 MD5 摘要身份验证的用户身份验证
表单认证
允许“匿名”用户访问经过身份验证的区域
核心身份验证
使用 SQL 数据库进行用户身份验证
使用 DBM 文件进行用户身份验证
使用文本文件进行用户身份验证
管理身份验证凭据缓存以减轻后端的负载
允许 FastCGI 授权器应用程序处理 Apache httpd 身份验证和授权
允许使用 LDAP 目录来存储用于 HTTP 基本身份验证的数据库
核心授权
使用 SQL 进行组授权和登录
使用 DBM 文件的组授权
使用纯文本文件的组授权
基于主机(名称或 IP 地址)的组授权
基于文件所有权的授权
用户授权
自动生成目录索引,类似于 Unix 命令或 Win32 shell commandlsdir
在将内容交付给客户端之前通过 Brotli 压缩内容
支持请求缓冲
符合 RFC 2616 的 HTTP 缓存过滤器
用于 HTTP 缓存过滤器的基于磁盘的存储模块
基于共享对象缓存 (socache) 的存储模块,用于 HTTP 缓存过滤器
CERN httpd 元文件语义
CGI脚本的执行
使用外部 CGI 守护程序执行 CGI 脚本
指定字符集转换或重新编码
将响应正文转换为 RFC2397 数据 URL
分布式创作和版本控制WebDAV 功能
mod_dav
的文件系统提供程序
mod_dav
的通用锁定模块
管理 SQL 数据库连接
在将内容交付给客户端之前对其进行压缩
以各种旧调制解调器标准定义的带宽速率限制发送静态内容
提供”跟踪斜线”重定向和服务目录索引文件
根据需要将所有 I/O 转储到错误日志
一个简单的回显服务器来说明协议模块
修改传递给 CGI 脚本和 SSI 页面的环境
说明 Apache 模块 API
根据用户指定的标准生成和 HTTP 标头ExpiresCache-Control
在传递给客户端之前通过外部程序传递响应正文
在内存中缓存静态文件列表
上下文敏感的智能过滤器配置模块
HTTP 请求和响应标题的自定义
将带有服务器状态的消息发送到前端代理
mod_heartbeat源服务器的集中监视器
支持 HTTP/2 运输层
RFC 1413 标识查找
服务器侧图像映像处理
服务器解析 html 文档(服务器侧包含)
提供服务器配置的全面概述
Apache for Windows 中的 ISAPI 扩展
待定请求计数负载平衡器调度器算法mod_proxy_balancer
请求计算负载平衡器调度器算法mod_proxy_balancer
加权流量计数负载平衡器调度器算法mod_proxy_balancer
心跳流量计数负载平衡器调度器算法mod_proxy_balancer
供其他 LDAP 模块使用的 LDAP 连接池和结果缓存服务
记录向服务器提出的请求
额外的可配置调试日志记录
对服务器发出的请求进行取证记录
记录每个请求的输入和输出字节
将 Lua 挂钩提供到 httpd 请求处理的各个部分
在 apache httpd 运行时配置文件中提供宏
跨虚拟主机管理域,通过 ACME 协议提供证书
将请求的文件名的扩展名与文件的行为(处理程序和过滤器)和内容(mime 类型、语言、字符集和编码)相关联
通过查看文件内容的几个字节来确定文件的 MIME 类型
提供内容协商
为 NetWare 启用 SSL 加密
支持 Solaris 特权和在不同用户 ID 下运行虚拟主机
多协议代理/网关服务器
mod_proxy 的 AJP 支持模块
mod_proxy
负载平衡的扩展
用于请求处理的 mod_proxy 扩展CONNECT
mod_proxy 的动态大规模反向代理扩展
用于 mod_proxy 的 FastCGI 支持模块
用于 mod_proxy 的 fdpass 外部进程支持模块
mod_proxy 的 FTP 支持模块
对 mod_proxy 的 Balancer 成员(工作人员)进行动态健康检查
重写 HTML 链接以确保它们可以从代理上下文中的客户端网络寻址
mod_proxy 的 HTTP 支持模块
mod_proxy 的 HTTP/2 支持模块
用于 mod_proxy 的 SCGI 网关模块
用于 mod_proxy 的 UWSGI 网关模块
用于 mod_proxy 的 Websockets 支持模块
客户端带宽速率限制
通过输出过滤器堆栈将请求正文反映为响应
将连接的原始客户端 IP 地址替换为代理或负载均衡器通过请求标头提供的用户代理 IP 地址列表
设置接收请求的超时和最小数据速率
用于处理和提供可用 HTTP 请求正文的过滤器
提供基于规则的重写引擎来即时重写请求的 URL
使用语法过滤输入(请求)和输出(响应)内容
会话支持
基于 Cookie 的会话支持
会话加密支持
基于 DBD/SQL 的会话支持
允许根据请求的特征设置环境变量
基于插槽的共享内存提供程序
基于插槽的共享内存提供程序
在启动或重新启动时将可执行代码和模块加载到服务器中
基于 DBM 的共享对象缓存提供程序
基于 Distcache 的共享对象缓存提供程序
基于 Memcache 的共享对象缓存提供程序
基于 Redis 的共享对象缓存提供程序
基于 shmcb 的共享对象缓存提供程序
尝试通过忽略大小写或尝试更正各种小拼写错误来更正错误的 URL
使用安全套接字层 (SSL) 和传输层安全 (TLS) 协议的强密码术
提供有关服务器活动和性能的信息
对响应体执行搜索和替换操作
允许 CGI 脚本作为指定的用户和组运行
为系统集成提供更好的支持
为每个请求提供一个具有唯一标识符的环境变量
Unix 系列平台的基本(必需)安全性
特定于用户的目录
站点上用户活动的点击流日志记录
版本相关配置
提供动态配置的海量虚拟主机
为其他模块提供基础设施以定期运行任务
增强了对基于 libxml2 的过滤器模块的字符集/国际化支持