手机版

如何在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

相关文章

  • CentOS 7 常用命令(系统关机、重启以及登出)

    关机:(系统的关机、重启以及登出 ) # 关闭系统(1)[root@localhost ~]# shutdown -h now # 关闭系统(2)[root@localhost ~]# init 0 # 关闭系统(3)[root@localhost ~]# telinit 0 # 按预定时间关闭系统[root@localhost...

    2019-12-07 服务器教程
  • linux重启命令 reboot与shutdown -r now的区别与联系

    在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的。shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告...

    2019-12-07 服务器教程
  • CentOS 7 如何使用命令重启或关机

    安装GNOME的朋友们首先切换到字符界面。切换到字符界面的方法如下: 先登陆进入系统,进入图形化界面,然后按Ctrl+Alt+F6(笔记本的是Ctrl+Alt+shift+Fn),进入字符界面。关机命令:shutdown或poweroffshutdown:shutdown -h now...

    2019-12-07 服务器教程
  • CentOS 7 正确关机重启的命令方法

    linux主要用于服务器领域,而在服务器上执行一项服务是永无止境的,除非遇到特殊情况,否则不会关机。和Windows不同,在linux系统下,很多进程是在后台执行的。在屏幕背后,可能有很多人同时在工作。如果直接按下电源的按钮,其他...

    2019-12-07 服务器教程
  • CentOS下的yum upgrade和yum update区别,没事别乱用!

    说明:生产环境对软件版本和内核版本要求非常精确,别没事有事随便的进行yum update操作!!!!!!!!!yum update: 升级所有包同时也升级软件和系统内核yum upgrade:只升级所有包,不升级软件和系统内核...

    2019-12-07 服务器教程
你可能感兴趣
热门浏览