Apache用户认证

有的网站在访问的时候需要我们输入账户名和密码,这样做的好处是增加了安全性,但是用户体验会很差。但是在我们在工作中还需要在一些重要的地方做一些安全认证。
首先我们编辑虚拟主机的配置文件

vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 我们用第二个虚拟主机做实验,然后在 ServerName下面下上如下的内容 <Directory /data/wwwroot/123.com> //指定认证的目录(这里的网址要和前面配置文件的网址一定要一致,负责不会成功)
AllowOverride AuthConfig //这个相当于打开认证的开关
AuthName "123.com user auth" //自定义认证的名字,作用不大
AuthType Basic //认证的类型,一般为Basic,其他类型阿铭没用过
AuthUserFile /data/.htpasswd //指定密码文件所在位置
require valid-user //指定需要认证的用户为全部可用用户
</Directory>

保存退出后我们要创建一个htpasswd文件,这个我们需要用apache自带的命令去生成。 /usr/local/apache2.4/bin/htpasswd -cm /data/.htpasswd aming(这里我们暂定用户名为aming,工作中还是要按照实际情况去定义)(-c,create。是创建 -m是md5加密模式) 按回车后就可以输入密码,然后重复输入密码。 如果我们再次创建一个用户和他的密码,那么我们就不用加参数-c了,以内我们已经创建过了。 然后我们从新加载做测试 [root@linletao-001 ~]# /usr/local/apache2.4/bin/apachectl -t(语法检查) Syntax OK [root@linletao-001 ~]# /usr/local/apache2.4/bin/apachectl graceful(重新加载)

curl-x测试 [root@linletao-001 ~]# curl -x127.0.0.1:80 111.com <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>401 Unauthorized</title>(401就表示访问的内容需要做用户认证) </head><body> Unauthorized <p>This server could not verify that you are authorized to access the document requested. Either you supplied the wrong credentials (e.g., bad password), or your browser doesn't understand how to supply the credentials required.</p> </body></html> 这样在查看网站的时候机会出现对话框,让你输入用户名和密码

如何在linux下输入密码 [root@linletao-001 ~]# curl -x127.0.0.1:80 -uaming:19860127 111.com(-u后面加有户名,“:”后面接密码)。 HTTP/1.1 200 OK(当密码正确的时候,状态码就为200,如果不对,则还是401) Date: Sun, 15 Apr 2018 12:56:22 GMT Server: Apache/2.4.33 (Unix) PHP/5.6.30 X-Powered-By: PHP/5.6.30 Content-Length: 7 Content-Type: text/html; charset=UTF-8

用户认证还可以针对某个文件进行认证 还可以针对单个文件进行认证<VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
<FilesMatch admin.php> 和网站认证不同的是,这里用的是FilesMatch而不是Directory,并且开始和结束都要一致。
AllowOverride AuthConfig
AuthName "123.com user auth"
AuthType Basic
AuthUserFile /data/.htpasswd
require valid-user
</FilesMatch> </VirtualHost>

域名跳转

一个网站会有多个域名,比如A可以访问一个域名,B也可以访问一个域名,而用A访问时浏览器的网址直接变成了B。这就是域名跳转过程。,那么他有什么作用呢?第一,一个网站有多个域名对SEO有影响,就是百度搜索关键词的排名有影响,如果把多个域名集中在一起,以一个域名为中心,这样就可以把权重集中在这个域名上,所以排名就靠前了。第二,如果之前的老域名不再使用,但搜索域名还留着以前的老域名,这样用户会搜索到我们的老域名并点击它,需要把老域名做一个跳转到新域名,这样用户搜索时候,也可以跳转到新域名。

具体操作如下 首先打开虚拟主机机配置文件 vim /usr/local/apache2.4/conf/extra/httpd-vhosts.conf 然后添加配置文件 <IfModule mod_rewrite.c> //需要mod_rewrite模块支持,这个模块在我们编译apache的时候用到的一个moust模块,这个模块会将大部分模块编译进来。如果不加,那么这个模块也就不会有了。
RewriteEngine on //打开rewrite功能
RewriteCond %{HTTP_HOST} !^www.111.com$ //定义rewrite的条件,当主机名(域名)不是www.111.com时,会自动跳转到111.com !表示取反 ,这里我们要定义开头和结尾,如果不定义开头和结尾,只要当域名中有111时就会认为他是正确的域名。所以我们一定要在主域名的前后加上^和$。 RewriteRule ^/(.*)$ http://www.123.com/$1 [R=301,L] //定义rewrite规则,当满足上面的条件时,这条规则才会执行 301为永久跳转,302为临时跳转,我们一般都用301。 </IfModule>

改完配置文件以后我们需要检测语法和重新加载 然后我们还需要到Apache的配置文件中查看LoadModule rewrite_module modules/mod_rewrite.so是否加载,如果被注释了,那么我们还需要将它重新加载。 [root@linletao-001 ~]# /usr/local/apache2.4/bin/apachectl -M |grep rewrite rewrite_module (shared)(加载成功) 如果修改了,我们在保存退出后还要进行语法检测和重新加载。 然后我们检测 [root@linletao-001 ~]# curl -x192.168.1.106:80 2111.com.cn -I HTTP/1.1 301 Moved Permanently Date: Sun, 15 Apr 2018 14:54:17 GMT Server: Apache/2.4.33 (Unix) PHP/5.6.30 Location: http://111.com/ Content-Type: text/html; charset=iso-8859-1 状态码为301,现在已经成功的跳转了。

apache访问日志

在cat /usr/local/apache2.4/logs/111.com-access_log有我们需要看的访问日志 [root@linletao-001 ~]# cat /usr/local/apache2.4/logs/111.com-access_log 192.168.1.106 - - [15/Apr/2018:13:56:22 +0800] "GET HTTP://www.example.com/ HTTP/1.1" 200 7 192.168.1.106 - - [15/Apr/2018:14:19:25 +0800] "GET HTTP://www.789.com/ HTTP/1.1" 200 7 192.168.1.106 - - [15/Apr/2018:20:34:16 +0800] "GET HTTP://www.111.com/ HTTP/1.1" 200 7 上面试我们访问日志的格式,而这个格式我们是可以定义格式的,在Apache的主配置文件中搜索LogFormat,在这下面有两个格式定义,分别是combined和common,combined内容会更丰富一些,它多了 referer 和 user-agent,我们将编辑虚拟主机配置文件,将common更改为combined ,重新访问测试,查看日志 <VirtualHost *:80>
DocumentRoot "/data/wwwroot/www.123.com"
ServerName www.123.com
ServerAlias 123.com
CustomLog "logs/123.com-access_log" combined(以前为common) </VirtualHost>