[学习]Apache 虚拟域名配置

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的特殊标记,可以取以下值:

  1. nocase或NC 表示忽略大小写。
  2. ornext或OR 表示多条RewriteCond语句之间是逻辑或的关系。默认情况下,多条RewriteCond语句之间是逻辑与关系。
  3. 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文件。

RewriteRule标记的文档

实际上重写规则还与RewriteBase有关,这里默认不指定RewriteBase

.htaccess文件

.htaccess文件也可以叫做分布式配置文件,提供了一种给每一个目录添加不同配置项的方式。

官方推荐:如果有访问httpd文件的权限,尽量不要使用.htaccess文件。因为使用.htaccess文件会降低Apache服务器的性能,所有在.htaccess文件中添加的配置指令都可以在Directory标签下配置,效果一样而性能更好。

关于.htaccess的详细信息可以看官方文档

参考文章

  1. 25 个有用 Apache ‘.htaccess’ 技巧
  2. Apache的Rewrite详解
  3. apache的虚拟域名rewrite配置以及.htaccess的使用
  4. Apache的Order Allow,Deny 详解
  5. .htaccess 详解
  6. Apache Module mod_rewrite

[学习]Apache 虚拟域名配置

上一篇:uni-app 之返回上一个页面并传递参数(以微信小程序为例)


下一篇:Labview中使用报表生成函数时开发环境可用而运行环境不可用的问题