如何在CentOS 7 Apache设置mod_rewrite

介绍

Apache是一个模块化的Web服务器,允许您通过启用和禁用模块来自定义其功能。这使管理员能够定制Apache的功能以满足其Web应用程序的需求。 在本教程中,我们将一个CentOS 7服务器上安装Apache,请确认 mod_rewrite模块被激活,并探讨一些基本功能。

先决条件

在遵循本教程之前,请确保您具有具有sudo权限的常规非root用户。您可以了解更多关于如何建立用户与这些特权从我们的向导, 如何创建在CentOS一个Sudo用户

第1步 - 安装Apache

我们将使用安装Apache yum ,为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从指令 NoneAll
/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/womenresults.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
定义404 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标志表示这是在最后一个规则的运行,如果执行。
如果您想 阻止从该IP地址访问,请使用以下代替:
/var/www/html/.htaccess
RewriteCond %{REMOTE_ADDR} ^(198\.51\.100\.24)$
RewriteRule (.*) - [F,L]
虽然你可以使用其他方法来阻止或允许您网站的流量,在设置限制 .htaccess文件是为取得这些成果的最简单方法。

结论

在本教程中,我们使用 .htaccess文件与工作 RewriteRuleRewriteCond指令。 有很多理由使用重写规则及以下资源详细的功能 mod_rewrite模块: mod_rewrite模块是Apache Web服务器的一个重要组成部分,你可以做很多与它。 然而,事情并不总是按计划进行,这时你会发现自己有重定向循环或不明确的 500 forbidden错误。 有关调试这类情况的提示,查看 这个StackOverflow文章 。
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏