手机版

如何在CentOS 7的Apache设置mod_rewrite

2019-09-29 阅读 :

介绍

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
. . .
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从指令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模块:
  • Apache mod_rewrite简介
  • Apache mod_rewrite 文档
  • mod_rewrite备忘单
mod_rewrite模块是Apache Web服务器的一个重要组成部分,你可以做很多与它。 然而,事情并不总是按计划进行,这时你会发现自己有重定向循环或不明确的500 forbidden错误。 
本文标题:如何在CentOS 7的Apache设置mod_rewrite - 服务器教程_服务器技术_服务器知识_vps教程
本文地址:https://www.helloaliyun.com/tutorial/1056.html

相关文章

  • 阿里云服务器ECS实例Linux操作系统须知

    阿里云服务器ECS实例Linux操作系统须知 不要修改Linux实例默认的/etc/issue文件内容。否则,根据实例创建的自定义镜像的系统发行版本无法被正确识别,使用该镜像创建的实例无法正常启动。 不要随意更改根目录所在分区下...

    2019-11-19 服务器教程
  • 阿里云服务器ECS实例Windows操作系统须知

    阿里云服务器ECS实例Windows操作系统须知 不要停止Windows系统自带的AliyunService服务或自带的shutdownmon.exe进程,停止后可能会影响控制台正常关机或者重启。 不要修改域控制器的hostname。 不建议从域控制器的虚拟...

    2019-11-19 服务器教程
  • 关于阿里云服务器ECS实例的操作须知

    为了保证阿里云服务器ECS实例的正常运行,在使用阿里云服务器ECS实例之前,请您务必认真阅读以下注意事项。操作须知 创建ECS实例后,您拥有实例的管理员权限,阿里云没有权限登录您的实例。 禁止使用ECS实例做流量穿透服务。...

    2019-11-19 服务器教程
  • 什么是可用区(Zone)?

    可用区(Zone)可用区是指在同一地域内,电力和网络互相独立的物理区域。同一可用区内实例之间的网络延时更小。在同一地域内可用区与可用区之间内网互通,可用区之间能做到故障隔离。是否将实例放在同一可用区内,主要取决于对...

    2019-11-18 服务器教程
  • 购买阿里云服务器在选择地域时需要考虑哪些因素?

    购买阿里云服务器在选择地域时,您需要考虑以下几个因素: 地理位置 请根据您以及您目标用户所在的地理位置选择地域。 中国大陆 一般情况下建议选择和您目标用户所在地域最为接近的数据中心,可以进一步提升用户访问速...

    2019-11-18 服务器教程
你可能感兴趣