如何在CentOS 7的Apache设置mod_rewrite
2019-09-29 阅读 : 次
介绍
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
. . .
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
. . .
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
的文件中的第二可变
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
模块:
- Apache mod_rewrite简介
- Apache mod_rewrite 文档
- mod_rewrite备忘单
mod_rewrite
模块是Apache Web服务器的一个重要组成部分,你可以做很多与它。 然而,事情并不总是按计划进行,这时你会发现自己有重定向循环或不明确的500 forbidden
错误。
本文地址:https://www.helloaliyun.com/tutorial/1056.html