apache的documentroot,directory,alias,virtualhost,rewrite各自存在理由,用途。10分钟精通httpd.conf常用配置

本人使用的windows的XAMPP(apache版本2.4.46):

首先看如下地址:

http://project1.mydomain.com/d:/folder1/xampp/htdocs/index.html
http://project1.mydomain.com/d:/folder2/wamp/www/index.html
http://project2.mydomain.com/e:/folder/yyy/index.html

是否有新的思考?或者你的问题更具体一些了?

apache的documentroot,directory,alias,virtualhost,rewrite各自存在理由,用途。10分钟精通httpd.conf常用配置_第1张图片

apache作为一个http服务提供程序,你不仅需要提供服务,而且要提供方便的服务,这是任何计算机服务或者项目的追求。

你让用户那么访问你的资源吗?不可能吧?

下面,跟着我的思路,快速的了解httpd.conf指令意义以及每个指令的存在理由,用途。

用户是通过上面绿色的域名(project1.mydomain.com),找到你的服务器,通过http协议默认端口80找到你监听服务的端口(或者指定的8088),再通过红色(d:/folder1/xampp/htdocs),找到目标资源的目录。

为什么我们安装完apache后,根据默认配置,浏览器的地址栏输入简简单单的 localhost 回车就会出现一个网页?

而开头举例中的地址却那么长?

这些实际上全部都配置在了httpd.conf中。

输入localhost发生了什么?

1.首先浏览器是默认就会把你这个地址当做http协议,访问80端口。

这就实际上变成了http://localhost

2.找到了服务器,找到了端口,下一个问题是,哪个目录?

实际上http://localhost也是http://localhost/,也就是 / 目录,即根目录。

根目录是哪里?

就是httpd.conf中的***最外最外层没有被其他标签包裹***的DocumentRoot的值。

xampp的是类似于D:/Program/XAMPP/htdocs

wamp的是类似于D:/Program/wamp/www

所以截止目前,你可以理解为实际上访问了 http://localhost/d:/Program/XAMPP/htdocs/

3.那目录找到了,访问哪个文件呢?

这就引出了另一个httpd.conf指令DirectoryIndex,它的值是若干个有序的文件名列表

它会在没有指定访问哪个文件时,按照排序依次寻找相应文件名是否存在,存在则返回给用户,一般为index.html,index.php等等的常用入口文件。

所以,到这里,我们实际上访问的是:http://localhost/d:/Program/XAMPP/htdocs/index.html

顺便说一下,如果是和我版本相同的你,你会发现这个命令是被包裹的。

意思是,如果dir_module为真,才会使用包裹在里面的指令。

 localhost回车时发生了什么已经差不多解释清楚了,下面开始以提问的方式,引出其他知识点。

1.《如果用户访问localhost/test.html,刚好服务器上有test.html会发生什么?》

如果按照默认配置,是能访问成功的。

那如果你的项目放在了这个目录下,任何文件用户都能访问,你怕不怕?

作为服务器,当然应该要有类似于白名单和黑名单的思想,我允许你访问什么,我不允许你访问什么。

这就引出了又一个httpd.conf指令,如:


    Options Indexes FollowSymLinks Includes ExecCGI
    AllowOverride All
    Require all granted

意思是:"D:/Program/XAMPP/htdocs" 目录下的权限相关指令是这一堆。例如Require all granted,允许所有请求。

那怎么弄成类似于白名单呢?

你就可以写成:

Require all denied
Require local
Require ip 192.168.3.7

我把本地访问和ip为192.168.3.7设置成了白名单

同理黑名单是:

Require all granted
Require not local
Require not ip 192.168.3.7

Require的规则是,从上到下,交叉的听后面的。

2.《如果说Directory标签模块是描述指定目录权限的指令,那没有描述的目录该怎么办?》

所以你会看见httpd.conf比较靠前的地方,第一个Directory如下:


    AllowOverride none
    Require all denied

根目录暂且描述全部拒绝和禁止,而后具体各自的目录各自独立描述指令,这就保证了没有描述的目录能继承最高级目录的权限指令。

3.《不同的Directory模块交叉描述同一个目录的权限时,听谁的?》

看官方描述

apache的documentroot,directory,alias,virtualhost,rewrite各自存在理由,用途。10分钟精通httpd.conf常用配置_第2张图片

大体意思就是,哪个指令离我最近用哪个,以根目录为最高级,越高的我越不听,天高皇帝远,就这个意思,只服直属上司。

先只用非正则,其中,先用Directory标签里的指令,再用.htaccess文件里的指令,再用正则的相关指令。

根目录的权限设定了以后,你就可以在它之下的具体更具体的目录中各自重新设置权限指令,

你如果仔细观察会发现,httpd.conf文件中,所有DocumentRoot(不管是最外层还是嵌套在VirtualHost标签里的)和alias后面都会紧跟着Directory描述。

因为你既然对某个目录做了一些访问方面的声明,就肯定需要描述权限相关的指令了呀,

要不然它的权限相关的指令会跟着一开始的根目录权限,全部拒绝了,这一段指令描述就没有意义了。

补充几个点:

1.Options -Indexes 和 Options +Indexes 和 Options Indexes的区别。

首先,他们完全不是一个概念,+是在自己直接上层继承下来的Options值中追加一个Indexes的意思。

比如上层是Options MultiViews FileInfo

那+Indexes后,当前目录会成为Options MultiViews FileInfo Indexes,没有加上,有就继续有

比如上层是Options MultiViews FileInfo Indexes

-Indexes后,当前目录会成为Options MultiViews FileInfo,有则取消,没有就继续没有

比如上层是Options MultiViews FileInfo

如果是直接Options Indexes,当前目录会成为Options Indexes,即覆盖

2.AllowOverride指令,会影响后面将要讲到的.htaccess文件中可用的指令范围。

mod_rewrite与.htaccess

像laravel这样,入口文件固定后,用路由的方式对外提供API,如:

http://localhost/public/index.php/myapiprefix/myapiname/......

public/index.php/所有接口都需要带上,冗余了,怎么去掉?

首先是可以把public用对应directory指定过去,使请求者不需要带上public,就直接到public目录就可以了,

其次就是要讲到的rewrite功能,通过配置服务器自己默认给用户加上把http://localhost/myapiprefix/myapiname/,当做http://localhost/index.php/myapiprefix/myapiname/

要用这个功能要满足如下几个条件:

1.把mod_rewrite扩展打开

2.指定目录的最终符合的directory描述中,允许.htaccess的使用,即AllowOverride指令的值里要有FileInfo

3.htaccess里有对于index.php重写的指令

虚拟目录 Alias

简单来讲,就是通过简短的代号,替代很长的一段目录。

再看看下面两个地址:

http://project1.mydomain.com/d:/folder1/xampp/htdocs/index.html
http://project1.mydomain.com/d:/folder2/wamp/www/index.html

假设我的httpd.conf设置最外层DocumentRoot为"d:/folder1/xampp/htdocs",

那第一个地址我现在就可以通过http://project1.mydomain.com访问到了。

那怎么访问第二个?最外层DocumentRoot已经确定的情况下,我总不能 http://project1.mydomain.com/../../../folder2/wamp/www/ 这么访问吧?

这就可以用到Alias指令了。如:

Alias /shortname "D:/folder2/wamp/www"

    Options FollowSymLinks
    AllowOverride None
    Require all denied
    Require local

意思是如果遇到有人访问shortname就把它定位到D:/folder2/wamp/www

那现在第二个地址,我可以用http://project1.mydomain.com/shortname访问了

这就是虚拟目录,咳咳,意思就是虚拟一下目录

虚拟主机

简单来讲,就是通过域名和端口等,替代很长的一段目录。

http://localhost/d:/folder1/xampp/htdocs/index.html
http://domain.com/e:/folder/yyy/index.html

上面第二个怎么访问呢?apache也不知道,因为配置中你也可以看到,默认最外层已经描述了两个参数:

listen 80
ServerName localhost:80

意思是,按照目前的配置apache只监听loalhost域名,80端口的服务,其他的不认识,不管你。

如果因为一些原因,你需要用不同的域名访问服务器,那总得设置相关服务呀。

所以有了VirtualHost,在一个主机服务的基础上,又虚拟出了第二个主机。


  ServerName domain.com
  DocumentRoot "E:/folder/yyy"
 
      Options FollowSymLinks
      AllowOverride None
      Require all denied
      Require local
 

意思是:如果用户访问了IP为127.0.0.1(假设本地服务器上的hosts(关于这个文件请另行查阅)文件上映射了domain.com为127.0.0.1),端口号为80的服务,该VirtualHost就会匹配到,

比对Servername为domain.com一致,则目录定位到E:/folder/yyy,并且里面嵌套的一堆指令就有效了。

所以上面第二个地址现在就可以用http://domain.com访问了。

虚拟主机还有很多其他用法,花样一点的可以自己慢慢研究。

但假如有很多个虚拟主机配置,甚至说也可以有多个开头的虚拟主机配置模块,

原则是:先匹配IP,再匹配端口,再匹配域名,先到先得,匹配到了就停了。

根据这个原理,可以玩出各种虚拟主机的花样,一个IP对应多个端口,一个IP一个端口对饮多个域名,多个IP对应多个域名,等等等等。


在大数据时代,在茫茫数据海中,不,在茫茫垃圾数据海中(所谓垃圾是相对的,就是我当前冲浪中不需要的数据对我来说都是垃圾),

一个小小的问题,稍稍的冷门,却动不动浪费我半天的时间,

我摇摇欲坠,这种感觉何时是个头儿。

希望有一天出现一个AI,整合问题及最佳答案直接返回给我。

你可能感兴趣的:(apache,apache)