Apache 虚拟域名配置
下面代码中#
表示注释:
# 新版本的Apache已经不需要写NameVirtualHost *:80了
NameVirtualHost *:80
# 虚拟域名配置块, *:80 表示接受任何ip的80端口访问
<VirtualHost *:80>
# 项目根目录
DocumentRoot "D:/wamp/www/testphp/"
# 虚拟域名
ServerName php.iyangyi.com
# 虚拟域名的别名 如果想把另外一个域名也指向这个项目目录,可以使用该配置项
ServerAlias www.pptv.cn
# 可选 服务器管理员的邮箱,当服务器出现故障时会向这个邮箱发邮件或者显示在页面上
ServerAdmin stefan321@qq.com
# 可选 错误日志显示路径,当访问出现错误的时候,就会记录到这里,注意:logs/dev-error.log 这个文件路径是apache的安装目录下的logs 目录 。
ErrorLog logs/dev-error.log
# 可选 访问日志,用来记录每一次的请求访问。注意:logs/dev-access.log 这个文件路径是apache的安装目录下的logs 目录 。记住:路径后面加common
CustomLog logs/dev-access.log common
# 可选 配置403,404等错误信息调整页面,用来访问出现404页面等情况时的错误页面展示。
# 注意:/404.html 这个文件路径是项目的根目录,不是apache的目录 。
ErrorDocument 404 logs/404.html
# <Directory> 后面跟的是项目根目录。标签下配置项目的rewrite规则
<Directory "D:/wamp/www/testphp/">
# 是否来显示文件根目录的目录列表
# Options Indexes FollowSymLinks 配置项表示如果项目根目录下有index.html或index.php文件,会显示index文件,如果没有显示项目目录
# 如果既有index.html又有index.php,会根据以下配置项显示,排在前的先显示:
# <IfModule dir_module>
# DirectoryIndex index.html index.htm index.php index.php3
# </IfModule>
# 如果不想显示项目目录可以配置成 Options FollowSymLinks 或者 Options -Indexes FollowSymLinks
Options Indexes FollowSymLinks
# 使项目目录下的.htaccess文件起作用。如果配置成AllowOverride None会禁止项目目录下的.htaccess
AllowOverride All
# 配置访问权限检查顺序,一般与Allow from 配置项配合使用。
# Deny与Allow用逗号分隔,不能有空格。
# Order Deny,Allow :表示设定“先检查禁止设定,再检查允许设定”
# Order Allow,Deny : 表示设定“先检查允许设定,再检查禁止设定”
# Allow和Deny,谁在最后则最后应用谁的规则
Order Allow,Deny
# Deny from All 、Deny from 127.0.0.1 禁止访问的ip, all 表示全部
# Allow from All、 Allow from 127.0.0.1 允许访问的ip, all 表示全部
Allow from all
# 以下是rewrite规则配置
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</Directory>
</VirtualHost>
Order Allow,Deny
Order Allow,Deny
举例:
Order Allow,Deny
Allow from all
Deny from 192.168.16.233
先检查Allow配置项,再检查Deny配置项,由于Deny在最后,所以虽然Allow配置了允许所有ip,但最后会禁止192.168.16.233 ip访问。
注意,上面例子中调换第二句和第三句的位置不会影响最终的规则,因为最终的规则是根据Order后的顺序决定的。
rewrite规则
重写规则属于Apache的
mod_rewrite
模块,详细内容可以看官方文档。
RewriteEngine on
开启URL重写功能。
RewriteCond
语句声明重写的条件,RewriteRule
语句声明具体的重写规则。
RewriteCond
语句的语法:
RewriteCond TestString CondPattern [Flags]
TestString
是一个字符串,可以是一个纯文本,也可以是支持的扩展结构,具体可以看官方文档。
CondPattern
是条件模式,是一个应用于TestString
的正则表达式。
Flags
是应用于CondPattern
的特殊标记,可以取以下值:
- nocase或NC 表示忽略大小写。
- ornext或OR 表示多条
RewriteCond
语句之间是逻辑或的关系。默认情况下,多条RewriteCond
语句之间是逻辑与关系。 - novary或NV 如果一个HTTP头应用了此条重写条件,该标识会阻止这个HTTP头被添加到响应头的Vary字段下。
比如:
RewriteCond %{REQUEST_URI} !^/blog/ [NC]
%{REQUEST_URI}
表示获取请求头REQUEST_URI
值,!^/blog/
表示不是/blog/
开头,NC
表示忽略大小写。
整句话的意思是:如果REQUEST_URI
的值不是/blog/
开头。
再比如:
RewriteCond %{REQUEST_FILENAME} !-f
-f
表示文件。上面代码的意思是:如果REQUEST_FILENAME
的值不是服务器上存在的文件。
RewriteRule
语句的语法:
RewriteRule RegExp RewriteString [Flags]
RegExp
是一个兼容Perl的正则表达式。RewriteString
是重写的规则。
比如:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?page=$1 [L]
L
标记表示对于符合RewriteCond
条件的请求,该条规则是最终的重写规则,不再匹配之后的重写规则。
上面的重写规则的意思是:如果当前请求的REQUEST_FILENAME
不是服务器上存在的文件,那么REQUEST_FILENAME
的值会与RewriteRule
里的正则表达式匹配,对于符合匹配的部分替换为index.php?page=$1
,并把匹配到的捕获组作为查询参数page
的值,$1
表示匹配结果中的第一个捕获组。
比如,你访问的链接是https://www.example.com/test/tt.html
,而服务器上根本不存在这个目录和文件,那么服务器会重写该请求为https://www.example.com/index.php?page=test/tt.html
,所以你实际上访问的是index.php
文件。
实际上重写规则还与
RewriteBase
有关,这里默认不指定RewriteBase
。
.htaccess文件
.htaccess文件也可以叫做分布式配置文件,提供了一种给每一个目录添加不同配置项的方式。
官方推荐:如果有访问httpd文件的权限,尽量不要使用.htaccess文件。因为使用.htaccess文件会降低Apache服务器的性能,所有在.htaccess文件中添加的配置指令都可以在
Directory
标签下配置,效果一样而性能更好。
关于.htaccess的详细信息可以看官方文档。