CentOS 下的apache下载及基本配置
更换yum源
不需要更换yum源
如果是腾讯或阿里的云服务器就不用更换了,因为云服务器生成的时候已经改过来
需要更换yum源
1.进入目录
cd /etc/yum.repos.d
2.ls 查看
我们要做的就是更换一下第一个文件,这个是默认带有的官方yum源,但是地址是在国外,下载时比较慢,我们给他换成163网易的yum源。
ls
3.利用mv给它改个名字
mv CentOS-Base.repo CentOS-Base.repo.back
4.查看一下,改好了
ls
5.下载163的yum源
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
6.然后他就会提示

7.我们使用一下,安装wget这个命令。
yum -y install wget
8.然后它会出现这个

这是因为之前第三步把原来的yum源改了名字,导致没有yum源可用,现在操作就是先修改回原来的名字。然后重新执行第七步。
mv CentOS-Base.repo.back CentOS-Base.repo
9.再安装wget命令

10.下载163的yum源,
wget http://mirrors.163.com/.help/CentOS7-Base-163.repo
下载完后查看,可以看到多了一个163的yum源
11.现在要做的就是将CentOS7-Base.repo改名,然后把CentOS7-Base-163.repo改为CentOS7-Base.repo,这样,名字是系统默认的yum源,实际已经替换成了163的yum源。
mv CentOS7-Base-163.repo CentOS7-Base.repo
安装Apache
Yum安装
yum -y install httpd # 安装
可以安装一个apache手册
yum -y install httpd-manual
查看是否安装成功
rpm -qa | grep httpd # 查看http包是否安装成功
# httpd-tools-2.4.6-97.el7.centos.5.x86_64
# httpd-2.4.6-97.el7.centos.5.x86_64
启动服务
# 启动命令
systemctl start httpd
systemctl start httpd.service
# 查看apache启动状态
systemctl status httpd
执行结果
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since 五 2022-06-17 18:11:19 CST; 29s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 100535 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─100535 /usr/sbin/httpd -DFOREGROUND
├─100536 /usr/sbin/httpd -DFOREGROUND
├─100537 /usr/sbin/httpd -DFOREGROUND
├─100538 /usr/sbin/httpd -DFOREGROUND
├─100539 /usr/sbin/httpd -DFOREGROUND
└─100540 /usr/sbin/httpd -DFOREGROUND
设置防火墙
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --reload
浏览器访问验证是否成功

编译安装
1. 安装依赖
yum -y install gcc make zlib-devel pcre pcre-devel openssl-devel
2. 下载源码包
https://httpd.apache.org/download.cgi
3. 上传安装包到服务器
4. 解压
tar -zxvf httpd-2.4.54.tar.gz
5.编译安装
这里安装到/usr/local目录下
./configure --prefix=/usr/local/apache && make && make install
6. 启动Apache服务
./bin/apachectl start # 启动apache服务
ps -ef | grep apache # 查看apache进程
root 125218 1 0 07:21 ? 00:00:00 /usr/local/apache/bin/httpd -k start
daemon 125219 125218 0 07:21 ? 00:00:00 /usr/local/apache/bin/httpd -k start
daemon 125220 125218 0 07:21 ? 00:00:00 /usr/local/apache/bin/httpd -k start
daemon 125221 125218 0 07:21 ? 00:00:00 /usr/local/apache/bin/httpd -k start
配置
请求转发
这段配置我新建了一个文件 andakeji_8002.conf 放到了 /etc/httpd/conf.d/ 目录下。
cd /etc/httpd/conf.d
vim andakeji_8002.conf
添加如下配置内容
LoadModule proxy_module /etc/httpd/modules/mod_proxy.so
LoadModule proxy_http_module /etc/httpd/modules/mod_proxy_http.so
LoadModule headers_module /etc/httpd/modules/mod_headers.so
<VirtualHost *:80>
ServerName iot.abc.com
ProxyPreserveHost On
ProxyRequests Off
ProxyPass /andakeji http://localhost:8002/
ProxyPassReverse /andakeji http://localhost:8002/
</VirtualHost>
如果不需要配置在虚拟主机,要对全局进行转发,则直接配置在httpd.conf最后添加:
ProxyPass /cas http://192.168.0.206:9090/cas
ProxyPassReverse /cas http://192.168.0.206:9090/cas
访问页面是否可以成功访问
http://62.234.221.57/andakeji
apache不加斜杠访问不到
当向服务器请求的是 http://www.example.com/faq ,服务器就会去查找一个叫faq的文件,而实际上faq是目录,应该请求而不是http://www.example.com/faq/时,所以就会报错,无法自动跳转
修改配置文件
vim /etc/httpd/conf/httpd.conf
# 输入/UseCanonicalName
# 将配置改为下面配置
UseCanonicalName On
修改路由规则
在DocumentRoot下,建立.htaccess文件,一定要加上“.”。写进如下内容
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ http://www.example.com/$1/ [R=301]
</IfModule>
rewrite重写路由规则
服务器级
模块导入代码在:/etc/httpd/conf.modules.d/00-base.conf
# 默认是开启的
LoadModule rewrite_module modules/mod_rewrite.so
在httpd.conf中添加如下代码
<IfModule mod_rewrite.c>
RewriteEngine On
#这里编写rewrite规则,具体语法,如下参数配置
</IfModule>
重启Apache
systemctl restart httpd
参数配置
HTTP headers 部分参数
1.HTTP_USER_AGENT
# 参考值:
HTTP_USER_AGENT Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.0.8) Gecko/2009032609 Firefox/3.0.8
2.HTTP_REFERER
# 参考值:
HTTP_REFERER http://www.test.cn/test.php
3.HTTP_COOKIE
# 参考值:
HTTP_REFERER ZDEDebuggerPresent=php,phtml,php3
4.HTTP_FORWARDED
# 参考值:
HTTP_FORWARDED # 如果使用代理服务器的话会是代理服务器的IP地址, 本地不容易搭环境测试出值来.
5.HTTP_HOST
# 参考值:
HTTP_HOST www.test.com
6.HTTP_PROXY_CONNECTION
# 参考值:
HTTP_PROXY_CONNECTION # 网络连接代理方面的信息. 和HTTP_FORWARDED参数一样. 本地不容易搭环境测试出值来
7.HTTP_ACCEPT
# 参考值:
HTTP_ACCEPT text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
server internals 部分参数
DOCUMENT_ROOT
# 参考值:
DOCUMENT_ROOT C:/webRoot/t
SERVER_ADMIN
# 参考值:
SERVER_ADMIN youemailaddress@gmail.com
SERVER_NAME
# 参考值:
SERVER_NAME www.test.com
SERVER_ADDR
# 参考值:
SERVER_ADDR 127.0.0.1
SERVER_PORT
# 参考值:
SERVER_PORT 80
SERVER_PROTOCOL
# 参考值:
SERVER_PROTOCOL HTTP/1.1
SERVER_SOFTWARE
# 参考值:
SERVER_SOFTWARE Apache/2.2.11 (Win32) PHP/5.2.9-1
connection & request 部分参数
REMOTE_ADDR
# 参考值:
REMOTE_ADDR 127.0.0.1 # 正在浏览当前页面用户的 IP 地址。
REMOTE_HOST
# 参考值:
REMOTE_HOST 127.0.0.1 # 正在浏览当前页面用户的主机名。反向域名解析基于该用户的 REMOTE_ADDR
REMOTE_PORT
# 参考值:
REMOTE_PORT 2574 # (变化的值)用户连接到服务器时所使用的端口
REMOTE_USER
# 参考值:
REMOTE_USER 空
REMOTE_IDENT
# 参考值:
REMOTE_IDENT空
REQUEST_METHOD
# 参考值:
REQUEST_METHOD GET
SCRIPT_FILENAME
# 参考值:
SCRIPT_FILENAME C:/webRoot/t/share77.html
PATH_INFO
# 参考值:
PATH_INFO 空
QUERY_STRING
# 参考值:
QUERY_STRING a=b&c=d&e=f
AUTH_TYPE
# 参考值:
AUTH_TYPE 空
date and time 部分参数
TIME_YEAR
# 参考值:
TIME_YEAR 2009
TIME_MON
# 参考值:
TIME_MON 04
TIME_DAY
# 参考值:
TIME_DAY 22
TIME_HOUR
# 参考值:
TIME_HOUR 16
TIME_MIN
# 参考值:
TIME_MIN 26 # 服务器获取当前时间的分钟
TIME_SEC
# 参考值:
TIME_SEC 34 # 服务器获取当前时间的秒
TIME_WDAY
# 参考值:
TIME_WDAY 3 # 服务器获取当天是星期几, 从星期日-星期六, 数字从 0-6
TIME
# 参考值:
TIME 20090422162634 # 服务器获取当前的时间, 格式为: 年月日时分秒
specials 部分参数
API_VERSION
样例参考值: 20051115:21
说明: apache 的 API 版本信息.
THE_REQUEST
样例参考值: GET /share77.html HTTP/1.1
说明: 浏览器发给服务器的请求值. 不包括其他的头信息.
REQUEST_URI
样例参考值: /share77.html
说明: 浏览器请求的资源信息.
REQUEST_FILENAME
样例参考值: C:/webRoot/t/share77.html
说明: 被请求的资源的在磁盘的物理地址.
IS_SUBREQ
样例参考值: false
说明: 如果是 sub-request 则显示为 true, 否则为 false.
HTTPS
样例参考值: off
说明: 如果连接使用 SSL/TLS 模式, 则值为on , 否则值为off, 这个参数比较安全, 即使未载入 mod_ssl 模块时.
重写路由规则
基本指令
对于Rewrite来说共有九个指令:RewriteBase, RewriteCond, RewriteEngine, RewriteLock, RewriteLog, RewriteLogLevel, RewriteMap, RewriteOptions, RewriteRule。
通常最常用的是 RewriteEngine, RewriteBase, RewriteCond, RewriteRule 四个指令
1. RewriteEngine: 就是是否使用 Rewrite 模式的开关, 使用就设置成 on, 否则设置成 off。
2. RewriteBase:如果使用目录别名的话就需要设置这个指令,假设一个网站目录使用了别名操作: RewriteBase /ceshi /123/456 那么当客户端访问/ceshi/index.html 文件时是相当于访问 /123/456/index.html。
3. RewriteCond:指令定义一条规则条件。在一条RewriteRule指令前面可能会有一条或多条RewriteCond指令,只有当自身的模板(pattern)匹配成功且这些条件也满足时规则才被应用于当前URL处理。注意,RewriteCond 指令后面可带 Flag, 现在只要2个可用, 一个是 NC(不区分大小写的意思), 一个是 OR(连接下一个条件)。这里对Rewritecond的正则匹配函数进行简单说明。
# 正则说明
第一个: ! 表示否的意思. 比如一个条件: 判断访问此页面的上一页URL是否包含 sex 字符的话可以用这样: RewriteCond %{HTTP_REFERER} !(sex)
第二个: < 就是小于的意思, TestString < CondPattern.
第三个: > 就是大于于的意思, TestString < CondPattern.
第四个: = 相等的意思. <, >, = 三个和通常程序语言使用的 <, >, = 功能类似.
第五个: -d 是否是一个目录. 判断TestString是否不是一个目录可以这样: !-d
第六个: -f 是否是一个文件. 判断TestString是否不是一个文件可以这样: !-f
第七个: -s 是否是一个正常的有大小的文件. 判断TestString是否不是一个正常的有大小的文件可以这样: !-s
第八个: -l 是否是一个快捷方式文件. 判断TestString是否不是一个快捷方式文件可以这样: !-l
第九个: -x 是否是一个文件并且又执行权限. 判断TestString是否不是一个文件并且又执行权限可以这样: !-x
第十个: -F 检查TestString是否是一个合法的文件,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。
第十一个: -U 检查TestString是否是一个合法的URL,而且通过服务器范围内的当前设置的访问控制进行访问。这个检查是通过一个内部subrequest完成的, 因此需要小心使用这个功能以降低服务器的性能。
4. RewriteRule:是一个简单的命令告诉mod_rewrite这个模块如何去重写,关键的地方在于可以在模式和替换中使用正则表达式来匹配相应的字符,正则表达式的广泛的灵活性能将动态的URL转换成各式各样的符合要求的静态URL。
5、FLAG_参数
C|chain
C|chain 意思: 字符 'C' 或者 字符串 'chain' 表示出了该行重写规则外还要有其他的重写规则, 相当于通常程序语言的 与符号 '&' , 如果第一条规则条匹配的话进行下一项条件匹配. 如果第一条或者中间一条匹配不成功. 在其后的都会被跳过.
CO|cookie
CO|cookie 意思: 字符 'CO' 或者 字符串 'cookie' 表示当某些特殊的规则被匹配到的时候, 允许设置一个COOKIE, 设置参数包含3个必须字段和2个可选字段.
三个必须的字段是设定COOKIE的名字, 值, 还有这个COOKIE的所属域名, 另外两个可选的字段是COOKIE的生存时间和路径.默认的COOKIE生存时间是浏览器的会话时间. 默认的路径是 '/', 针对整个网站.
实际的使用例子想下面这样
RewriteEngine On
# RewriteRule 匹配模式 - [CO=COOKIE名称:COOKIE值:COOKIE域名:生存时间:路径] 各个参数用冒号:连接
RewriteRule ^/index.html - [CO=mycookie:myCookieValue:.test.com:1440:/]
#RewriteRule ^/index.html - [CO=mycookie:myCookieValue:.test.com] 或者省略后面的参数.
上面的规则的意思是在请求 index.html 文件的时候设置一个COOKIE值. COOKIE名是 mycookie, 值是:myCookieValue, 生效的域名是 .test.com, 生效时间是分钟计算的. 也就是生存时间是1天=24小时=1440分钟.
E|env
E|env 意思: 字符 'E' 或者 字符串 'env' 表示你可以设置一个环境变量. 注意一下变量在这个规则运行后生效.
看一个简单的例子, 就是apache在记录日志的时候不记录图片的读取记录. 那么下面的规则就有用了.
RewriteRule .(png|gif|jpg) - [E=image:1]
CustomLog logs/access_log combined env=!image
F|forbidden
F|forbidden 意思: 字符 'F' 或者 字符串 'forbidden' 表示禁止访问. Apache服务器会返回403禁止访问状态码给客户端.
下面的规则表示获取或者下载 exe程序文件是被显示禁止访问.
RewriteRule .exe - [F]
G|gone
G|gone 意思: 字符 'G' 或者 字符串 'gone' 表示服务器响应状态码为:410 通常使用该标志的时候 target 目标值设置成 "-" 被请求的资源是有效的.
下面的例子表示旧的资源是有效的. 并且不在乎大小写.
RewriteRule oldproduct - [G,NC]
H|handler
H|handler 意思: 字符 'H' 或者 字符串 'handler' 表示强制使用某类型处理程序处理被请求的资源. 比如请求一些不带后缀的文件的时候. 下面的列子表示当请求的URL里没有带'.'的时候, 强制使用PHP来处理这类的请求.
RewriteRule !. - [H=application/x-httpd-php]
L|last
L|last 意思: 字符 'L' 或者 字符串 'last' 表示当前规则是最后一条规则,停止分析以后规则的重写。该标志的使用频率非常高.
RewriteCond %{REQUEST_URI} !index.php
RewriteRule ^(.*) index.php?req=$1 [L]
一定要注意的地方, 使用[L]标志的时候, 一定要注意你的匹配条件, 不会非常容易让你的重写规则陷入死循环, 比如你要定义页面所有页面请求都重写到一个 index.php 文件, 那么一定要注意在匹配条件时确定当请求的脚本不是index.php时才执行重写规则. 不然很明显当前页面请求的是 index.php, 当然 这个请求被重写到 index.php 然后index.php又被重写到index.php.. 这样反复执行. 页面会报错. 错误日志会记录报告你超出最大的重定向次数.
N|next
N|next 意思: 字符 'N' 或者 字符串 'next' 表示重新回到规则顶部重复执行. 一般在极端情况下用这个标志. 相当于一个while循环, 知道匹配失败时返回. 下面的例子表示把请求地址中的所有A字符替换成B字符.
RewriteRule (.)A(.) $1B$2 [N]
NC|nocase
NC|nocase 意思: 字符 'NC' 或者 字符串 'nocase' 表示请求的规则部分不区分大小写. 类似正则式里的/xxx/i 模式.
RewriteRule (.*.(jpg|gif|png))$ http://images.test.com$1 [P,NC]
NE|noescape
NE|noescape 意思: 字符 'NE' 或者 字符串 'noescape' 表示不对URL中的特殊字符进行 hexcode 转码.看下面的例子:
RewriteRule ^/share/(.+) /goShare.html#$1 [NE,R]
上面的例子表示所有请求 /share/xxx.xx的请求都会被定向到/goShare.html文件上. 并且后面的部分作为一个#后面的值. 如果不加NE标志的话, #将被转义成 %23 这样就造成 404 错误了.
NS|nosubreq
NS|nosubreq 意思: 字符 'NS' 或者 字符串 'nosubreq' 表示只用于不是内部子请求.比如,在mod_include试图搜索可能的目录默认文件(index.xxx)时, Apache会内部地产生子请求。对子请求,它不一定有用的,而且如果整个规则集都起作用,它甚至可能会引发错误。所以,可以用这个标记来排除某些规则。根据你的需要遵循以下原则: 如果你使用了有CGI脚本的URL前缀,以强制它们由CGI脚本处理,而对子请求处理的出错率(或者开销)很高,在这种情况下,可以使用这个标记。
P|proxy
P|proxy 意思: 字符 'P' 或者 字符串 'proxy' 标志需要模块 mod_proxy 支持, 类似一个分发器网关的作用.比如网站的所有图片想用单独的一台服务器来运行. 那么先前的代码里的图片请求的时候, 直接定向到图片服务器去.
RewriteRule (.*).(jpg|gif|png) http://images.example.com$1.$2 [P]
使用[P]标志, 意味着使用了[L]标志, 因为使用该标志后马上就重定向到新地址了. 后面的重写规则会被忽略掉.
PT|passthrough
PT|passthrough 意思: 字符 'PT' 或者 字符串 'passthrough' 表示替换URL请问部分的地址.看例子
Alias /icons /usr/local/apache/icons
RewriteRule /pics/(.+).jpg /icons/$1.gif [PT]
当请求/pics/下的图片文件时, 实际是返回的是 /icons/目录下的同名文件. 需要注意的是一定要设置 [PT] 标志. 否则Alias设置无效.
QSA|qsappend
QSA|qsappend 意思: 字符 'QSA' 或者 字符串 'qsappend' 不怎么好表示. 看例子:
RewriteRule /pages/(.+) /page.php?page=$1 [QSA]
如果又标志: [QSA] 那么重写后的URL是: /page.php?page=123&one=two
如果没有[QSA]标志, 那么结果是: /page.php?page=123
此标记强制重写引擎在已有的替换串中追加一个请求串,而不是简单的替换。 如果需要通过重写规则在请求串中增加信息,就可以使用这个标记。
R|redirect
R|redirect 意思: 字符 'R' 或者 字符串 'redirect' 表示进行重定向, 状态码在300-399里随机出, 默认是 302 重定向.通常和标志L一起使用. 使用模式: [R[=302]]
S|skip
T|type 意思: 字符 'S' 或者 字符串 'skip' 表示跳过执行下面的几个重写规则. 又点类似goto. 看下面的例子, 如果URL请求的文件不存在的话就跳过下面的两行重写规则.
# 请求的文件是否存在
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# 不存在的情况
RewriteRule .? - [S=2]
RewriteRule (..gif) images.php?$1
RewriteRule (..html) docs.php?$1
T|type
T|type 意思: 字符 'T' 或者 字符串 'type' 表示为apache设置特定请求的响应类型. 也就是常说的 MIME type,比如一个perl脚本. 希望给客户端显示文本源码, 那么可以这样做:
RewriteRule .pl$ - [T=text/plain]
或者你的服务器上的文件没有设置扩展名. 那么可以通知重写添加该文件的类型. 方便客户端显示.
RewriteRule IMG - [T=image/jpg]
常用配置实例
例子1: 所有请求都定向到 index.php 脚本, 注意要排除 index.php 本身. 比如就进入死循环了.
RewriteRule !^index.php$ index.php [L]
例子2: 当请求不存在的资源时, 统一定义到根目录下的 404.html
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /404.html [L]
例子3: 限制访问. 比如来自一些不友好的网站连接过来的请求. 不允许访问. 下例中如果 HTTP_REFERER 中包含 sex 字符, 则不允许访问.
RewriteCond %{HTTP_REFERER} sex
RewriteRule ^.*$ - [F]
例子4: 按照时间显示不同的页面, 比如访问 hello.html 页面时. 如果 在 8:00-19:00 的时候访问. 显示 hello.day.html 其他时间访问显示: hello.night.html
RewriteCond %{TIME_HOUR}%{TIME_MIN} >0700
RewriteCond %{TIME_HOUR}%{TIME_MIN} <1900
RewriteRule ^hello.html$ hello.day.html
RewriteRule ^hello.html$ hello.night.html
例子5: 伪静态化, 比如访问 /user20.html 则调用viewUser.php 显示用户ID为20的用户资料
RewriteRule ^user([0-9]*).html$ viewUser.php?userid=$1
例子6: 喜欢用二级域名的比较实用了. 比如网站目录下有 user, upload 等几个目录, 可以通过 http://www.test.com/user 这样的模式访问. 但是如果想做成统一用二级域名模式访问: http://user.test.com , 但是不允许 http://www.test.com/user 这样访问. 那么就像下面这样来限制.
RewriteCond %{REQUEST_URI} ^/user
RewriteRule ^.*$ http://user.test.net" [L]
目录级
当向服务器请求的是http://www.example.com/faq而不是http://www.example.com/faq/时,服务器就会去查找一个叫faq的文件,而实际上faq是目录,所以就会报错,无法自动跳转
修改httpd.conf配置文件
# 找到这条配置
<Directory />
Options FollowSymLinks
AllowOverride None
</Directory>
# 修改为
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
在DocumentRoot下,建立.htaccess文件,一定要加上“.”。写进如下内容
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.+[^/])$ http://www.example.com/$1/ [R=301]
</IfModule>

浙公网安备 33010602011771号