介绍
Apache是一个模块化的Web服务器,允许您通过启用和禁用模块来自定义其功能。这使管理员能够定制Apache的功能以满足其Web应用程序的需求。 在本教程中,我们将一个CentOS 7服务器上安装Apache,请确认mod_rewrite
模块被激活,并探讨一些基本功能。
先决条件
在遵循本教程之前,请确保您具有具有sudo权限的常规非root用户。您可以了解更多关于如何建立用户与这些特权从我们的向导, 如何创建在CentOS一个Sudo用户 。第1步 - 安装Apache
我们将使用安装Apacheyum
,为CentOS默认的包管理实用程序。
sudo yum install httpd
当提示
Is this ok [y/d/N]:
消息类型
Y
然后按
ENTER
键授权安装。 接下来,启动Apache守护进程,创建子进程或线程来处理请求,用一个独立进程
systemctl
实用程序:
sudo systemctl start httpd
为了确保Apache的成功启动,请与自己的状态
status
的命令:
sudo systemctl status httpd
Output. . .
systemd[1]: Starting The Apache HTTP Server...
systemd[1]: Started The Apache HTTP Server.
随着Apache的启动和运行,让我们把注意力转向它的模块。
第2步 - 验证mod_rewrite
截至CentOS的版本7,mod_rewrite
Apache模块默认情况下启用。 我们会验证这是与案件
httpd
命令和
-M
标志,打印所有加载的模块列表:
httpd -M
Output . . .
remoteip_module (shared)
reqtimeout_module (shared)
rewrite_module (shared)
setenvif_module (shared)
slotmem_plain_module (shared)
. . .
如果
rewrite_module
不会在输出里出现,通过编辑使它
00-base.conf
文件
vi
编辑:
sudo vi /etc/httpd/conf.modules.d/00-base.conf
一旦文本文件打开输入
i
进入插入模式,然后添加或取消注释以下突出显示的一行:
/etc/httpd/conf.modules.d/00-base.conf
#
# This file loads most of the modules included with the Apache HTTP
# Server itself.
#
. . .
LoadModule rewrite_module modules/mod_rewrite.so
. . .
现在按下
ESC
退出插入方式。 然后,输入
:x
,然后按
ENTER
键保存并退出该文件。 接下来,通过重新启动Apache来应用配置更改:
sudo systemctl restart httpd
随着Apache安装和
mod_rewrite
启用模块,我们已经准备好配置使用的
.htaccess
文件。
第3步 - 设置.htaccess文件
一个.htaccess
文件允许指令为Apache,包括的定义
RewriteRule
,在每个域的基础上,而无需更改服务器配置文件。 在Linux中,前面有一个点(文件
.
为隐藏)进行处理。 使用前
.htaccess
文件,我们需要更新
AllowOverride
设置能覆盖Apache指令。
sudo vi /etc/httpd/conf/httpd.conf
找到
<Directory /var/www/html>
部分,然后更改
AllowOverride
从指令
None
到
All
:
/etc/httpd/conf/httpd.conf
. . .
<Directory /var/www/html>
. . .
#
# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
# Options FileInfo AuthConfig Limit
#
AllowOverride All
. . .
</Directory>
. . .
保存并退出文件,然后重新启动Apache以应用更改:
sudo systemctl restart httpd
接下来,创建
.htaccess
在默认文档根目录,文件
/var/www/html
,为Apache。
sudo vi /var/www/html/.htaccess
以下行添加到文件的顶部激活
RewriteEngine
,它指示Apache的处理遵循任何规则:
/var/www/html/.htaccess
RewriteEngine On
保存并退出文件。 您现在有一个
.htaccess
文件,将让你定义的规则来操作URL的需要。 在我们进入实际编写规则,让我们花点时间复习基本
mod_rewrite
语法。
第4步 - 探索RewriteRule语法
该RewriteRule
指令允许我们基于该URL的重新映射请求到Apache。 一个
.htaccess
文件可以容纳多个重写规则,但在运行时的Apache适用于自己定义的顺序规则。重写规则由以下结构组成:
RewriteRule Pattern Substitution [Flags]
- RewriteRule:指定
RewriteRule
指令 - Pattern:一个所期望的字符串匹配PCRE(Perl兼容的正则表达式)。 您可以了解更多关于正则表达式在这里 。
- Substitution :应该在哪里匹配的请求被发送
- [Flags]:可选参数修改规则。 有关可用标志及其含义的更多信息,请参见Apache的文档上重写标志 。
RewriteRule
是的主要
mod_rewrite
指令,这就是为什么我们主要是专注于它在本教程中。
第5步 - 探索RewriteCond语法
该RewriteCond
指令,使我们能够添加条件重写规则。重写条件包括以下结构:
RewriteCond TestString Condition [Flags]
- RewriteCond 指令:指定
RewriteCond
指令 - TestString:一个字符串,以测试对
- Condition :模式匹配
- [Flags]:可选参数修改状态。
RewriteCond
指令不允许Apache认为遵循它,除非特定的条件计算为true的任何重写规则。
第6步 - 设置文件
我们将建立一个基本的重写规则,允许用户访问一个about.html
而无需键入文件扩展名(页面
.html
web浏览器的地址栏中)。 通过创建一个启动
about.html
文档根目录下的文件:
sudo vi /var/www/html/about.html
将以下HTML代码复制到文件中:
/var/www/html/about.html
<!DOCTYPE html>
<html>
<head>
<title>About Us</title>
</head>
<body>
<h1>About Us</h1>
</body>
</html>
保存并退出文件。 在Web浏览器中,导航到以下地址:
http://server_domain_or_IP/about.html
你应该会看到一个空白的页面, 显示
About Us就可以了。 如果您从地址栏
.html和重新加载页面,您会收到一个404
Not Found错误。 Apache只能通过它们的完整文件名访问组件,但是我们可以使用重写规则来改变它。
第7步 - 设置RewriteRule
我们希望游客到 公司简介页面,而不必键入访问它.html
。为了实现这一点,我们将创建一个规则。 打开
.htaccess
文件:
sudo vi /var/www/html/.htaccess
后
RewriteEngine On
线,添加以下内容:
/var/www/html/.htaccess
RewriteRule ^about$ about.html [NC]
保存并退出文件。 游客现在可以用访问
简介页面
http://server_domain_or_IP/about
URL。 让我们来看看重写规则:
^about$
作为该会从该网址匹配的模式,以及什么类型的用户在其浏览器。 我们的例子使用一对
元字符以确保该术语仅在网址中的特定位置是否存在:
^
表示URL的开始,之后server_domain_or_IP/
。&
是指URL的末尾
about.html
显示的路径的Apache服务时遇到匹配模式的文件。
[NC]
是指示重写规则是不区分大小写的,以便用户可以输入URL中的小写和大写字母的标志。 例如,以下网址指向
about.html
文件:
- serverdomainor_IP/about
- serverdomainor_IP/About
- serverdomainor_IP/ABOUT
常见模式
现在我们已经基本了解了重写规则,我们将在本节中探讨两个额外的示例。 可以设置示例文件,但本教程不包括创建它们;只是重写规则本身。示例1:使用RewriteRule简化查询字符串
Web应用程序通常使用的查询字符串,使用问号字符追加到URL的(?
)和符号字符分隔(
&
)。当匹配重写规则时,Apache忽略这两个字符。但是,在页之间传递数据时可能需要查询字符串。例如,使用PHP编写的搜索结果页的网址可能如下所示:
http://example.com/results.php?item=shoes&type=women
相反,我们希望我们的访问者能够使用以下更简洁的URL:
http://example.com/shoes/women
我们可以通过两种方式之一实现这些结果 - 通过简单的替换或匹配选项。
示例1A:简单替换 我们将创建一个执行简单替换的重写规则,从而简化长查询网址:
/var/www/html/.htaccess
RewriteRule ^shoes/women$ results.php?item=shoes&type=women
规则映射
shoes/women
到
results.php?item=shoes&type=women
。
示例1B:匹配选项 在某些情况下,我们可能希望将查询字符串概括为包含不同类型。我们可以通过执行以下操作来完成此操作:
- 使用垂直管道指定一系列选项
|
,布尔“OR”操作符 - 集团使用匹配
()
然后使用引用组$1
变量,以1
为第一匹配的组
/var/www/html/.htaccess
RewriteRule ^shoes/(men|women|youth) results.php?item=shoes&type=$1
上面显示的规则的URL匹配
shoes/
后跟一个指定的类型的shoes。这将修改原始网址,以便:
http://example.com/shoes/men
变为:
http://example.com/results.php?item=shoes&type=men
此匹配选项允许Apache评估几个模式,而不必为每个模式创建单独的重写规则。
示例1C:匹配字符集 然而,我们也想指定任何项目,它不限制只
/shoes
。所以,我们将做以下:
- 编写匹配所有字母数字字符的正则表达式 。 括号表达式
[ ]
任何字符匹配它的内部,而+
任意数量的括号内指定的字符相匹配 - 组的匹配,并且与引用它
$2
的文件中的第二可变
/var/www/html/.htaccess
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2
以上示例将转换:
http://example.com/pants/men
改为:
http://example.com/results.php?item=pants&type=men
我们成功地扩展了匹配功能,以包含网址的多个方面。
示例1D:传递查询字符串 本节不介绍任何新概念,但解决可能出现的问题。使用上面的例子,假设我们想重定向
http://example.com/pants/men
,但会通过额外的查询字符串
?page=2
。我们想映射以下URL:
http://example.com/pants/men?page=2
改为:
http://example.com/results.php?item=pants&type=men&page=2
如果你要试图访问我们的当前设置上面的URL,你会发现,查询字符串
page=2
丢失。 这是很容易使用附加的固定
QSA
标志,这将导致要组合的查询字符串。修改重写规则以匹配以下内容将实现所需的行为。
/var/www/html.html
RewriteRule ^([A-Za-z0-9]+)/(men|women|youth) results.php?item=$1&type=$2 [QSA]
示例2:使用逻辑添加条件
现在我们要看看使用的RewriteCond
指令。 如果重写条件的计算结果为真,那么Apache认为
RewriteRule
它后面。
示例2A:默认页 此前,我们看到的Apache通过提供一个404页面
未找到办理无效URL的请求。但是,我们希望所有格式不正确的网址重定向回到首页,而不是错误网页。使用条件,我们可以检查所请求的文件是否存在。
/var/www/html/.htacces
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^admin/(.*)$ /admin/home
这将重定向像
/admin/random_text
到
/admin/home
。 让我们剖析上面的规则:
%{REQUEST_FILENAME}
检查请求的字符串!-f
的!
是不操作状态 ,如果请求的文件名不存在,然后执行以下重写规则。RewriteRule
重定向请求回/admin/home
ErrorDocument
将遵循最佳做法。 为了做到这一点,我们将创建一个
ErrorDocument
规则,使其指向404错误到
error.html
页面:
/var/www/html/.htaccess
ErrorDocument 404 /error.html
这重定向导致在HTTP 404响应任何请求
error.html
页面。
示例2B:IP地址限制 一
RewriteCond
可以用来允许通过特定的IP地址访问站点。 这个例子阻止流量来自世界各地
,除了 198.51.100.24。
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} !^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
整个规则规定,如果请求资源的IP地址不是198.51.100.24,则不允许访问。 简而言之:
%{REMOTE_ADDR}
是地址字符串!^(198\.51\.100\.24)$
否定的IP地址。 该\
反斜杠转义,.
它们充当用来匹配任何字符的元字符。- 所述
F
标志禁止访问,和L
标志表示这是在最后一个规则的运行,如果执行。
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
虽然你可以使用其他方法来阻止或允许您网站的流量,在设置限制
.htaccess
文件是为取得这些成果的最简单方法。
结论
在本教程中,我们使用.htaccess
文件与工作
RewriteRule
和
RewriteCond
指令。 有很多理由使用重写规则及以下资源详细的功能
mod_rewrite
模块:
该
mod_rewrite
模块是Apache Web服务器的一个重要组成部分,你可以做很多与它。 然而,事情并不总是按计划进行,这时你会发现自己有重定向循环或不明确的
500 forbidden
错误。 有关调试这类情况的提示,查看
这个StackOverflow文章 。