Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何在Ubuntu 18.04上使用mod_rewrite for Apache重写URL

如何在Ubuntu 18.04上使用mod_rewrite for Apache重写URL

原创
作者头像
水门
修改于 2018-10-22 03:34:47
修改于 2018-10-22 03:34:47
4.8K00
代码可运行
举报
运行总次数:0
代码可运行

介绍

Apache的mod_rewrite模块允许您以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。它还允许您根据条件重写URL。

使用.htaccess文件可以创建和应用重写规则,而无需访问服务器配置文件。通过将.htaccess文件放在网站的根目录中,您可以基于每个站点或每个目录管理重写。

在本教程中,您将启用mod_rewrite并使用.htaccess文件来创建基本URL重定向,然后探索几个高级用例。

先决条件

要学习本教程,您需要:

  • 一个Ubuntu 18.04服务器,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 一个具有sudo权限的非root用户,并且在您的服务器上启用防火墙,如果您使用的是腾讯云的CVM服务器,您可以直接在腾讯云控制台中的安全组进行设置。
  • 安装Apache。

第1步 - 启用mod_rewrite

为了让Apache了解重写规则,我们首先需要激活mod_rewrite。它已经安装,但在默认的Apache安装上被禁用。使用该a2enmod命令启用模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo a2enmod rewrite

这将激活模块或提醒您模块已启用。要使这些更改生效,请重新启动Apache。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo systemctl restart apache2

mod_rewrite现已完全启用。在下一步中,我们将设置一个.htaccess文件,我们将用它来定义重定向的重写规则。

第2步 - 设置.htaccess

一个.htaccess文件,允许我们修改我们的重写规则,而无需访问服务器配置文件。因此,.htaccess对Web应用程序的安全性至关重要。文件名之前的句点可确保隐藏文件。

注意:您可以将任何放在.htaccess文件中的规则也可以直接放入服务器配置文件中。实际上,正式的Apache文档建议使用服务器配置文件,而不是用.htaccess来配置,因为Apache可以用这种方式更快地处理它。

但是,在这个简单的例子中,性能提升可以忽略不计。此外,在.htaccess中设置规则很方便,尤其是在同一服务器上有多个网站。它不需要服务器重新启动即可使更改生效,并且不需要root权限即可编辑这些规则,从而简化维护并使用非特权帐户进行更改。一些流行的开源软件,如Wordpress和Joomla,通常依赖.htaccess文件来使软件文件来修改和创建额外的按需规则。

在开始使用.htaccess文件之前,您需要设置并保护更多设置。

默认情况下,Apache禁止使用.htaccess文件来应用重写规则,因此首先需要允许更改文件。使用nano或您喜欢的文本编辑器打开默认的Apache配置文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo nano /etc/apache2/sites-available/000-default.conf

在该文件中,您将在第一行找到一个<VirtualHost *:80>块。在该块的内部,添加以下新块,以使您的配置文件如下所示。确保所有块都正确缩进。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<VirtualHost *:80>
    <Directory /var/www/html>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
        Require all granted
    </Directory>. . .
</VirtualHost>

保存并关闭文件。要使这些更改生效,请重新启动Apache。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo systemctl restart apache2

现在,在Web根目录中创建一个.htaccess文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo nano /var/www/html/.htaccess

在新文件的顶部添加此行以激活重写引擎。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteEngine on

保存文件并退出。

您现在拥有一个可用于管理Web应用程序路由规则的.htaccess操作文件。在下一步中,我们将创建示例网站文件,我们将使用它们来演示重写规则。

第3步 - 配置URL重写

在这里,我们将设置一个基本的URL重写,将漂亮的URL转换为实际的页面路径。具体来说,我们将允许用户访问http://your_server_ip/about,但显示一个名为about.html的页面。

首先在Web根目录中创建一个名为about.html的文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo nano /var/www/html/about.html

将以下HTML代码复制到该文件中,然后保存并关闭它。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<html>
    <head>
        <title>About Us</title>
    </head>
    <body>
        <h1>About Us</h1>
    </body>
</html>

您可以通过http://your_server_ip/about.html来访问此页面,但请注意,如果您尝试访问http://your_server_ip/about``/about,则会看到404 Not Found错误。要使用相反的方式访问页面,我们将创建一个重写规则。

所有的RewriteRules都应遵循以下格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule pattern substitution [flags]
  • RewriteRule 指定指令。
  • pattern是一个正则表达式,匹配URL中所需的字符串,这是查看器在浏览器中键入的内容。
  • substitution 是实际URL的路径,即文件Apache服务器的路径。
  • flags 是可以修改规则工作方式的可选参数。

让我们创建我们的URL重写规则。打开.htaccess文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo nano /var/www/html/.htaccess

在第一行之后,添加标记为红色的RewriteRule并保存文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteEngine on
RewriteRule ^about$ about.html [NC]

在这种情况下,^about$是模板,about.html是替换,同时[NC]是标志。我们的示例使用了一些具有特殊含义的字符:

  • ^表示your_server_ip/之后的URL的开头。
  • $ 表示URL的结尾。
  • about 匹配字符串“about”。
  • about.html 是用户访问的实际文件。
  • [NC] 是一个使规则不区分大小写的标志。

您现在可以在浏览器中访问http://your_server_ip/about。事实上,根据上面显示的规则,以下网址将指向:about.html

  • http://your_server_ip/about,因为规则的定义。
  • http://your_server_ip/About,因为规则不区分大小写。
  • http://your_server_ip/about.html,因为原始的正确文件名将始终有效。

但是,以下内容不起作用:

  • http://your_server_ip/about/,因为规则明确规定about之后可能没有任何内容,因为$角色出现在about之后。
  • http://your_server_ip/contact,因为它与规则中about的字符串不匹配。

您现在拥有一个带有基本规则的.htaccess操作文件,您可以根据自己的需要进行修改和扩展。在以下部分中,我们将展示常用指令的另外两个示例。

示例1 - 使用RewriteRule简化查询字符串

Web应用程序通常使用查询字符串,这些字符串在地址后使用问号(?)附加到URL 。使用&符号(&)分隔单独的参数。查询字符串可用于在各个应用程序页面之间传递附加数据。

例如,用PHP编写的搜索结果页面可能使用类似的URL http://example.com/results.php?item=shirt&season=summer。在此示例中,将两个附加参数传递给虚构的result.php的值为使用值shirt应用程序脚本item,和值为 summer的应用程序脚本season。应用程序可以使用查询字符串信息为访问者构建正确的页面。

Apache重写规则通常用于将如上所述的长而不愉快的链接简化为友好的URL,这些URL更易于在视觉上进行打字和解释。在这个例子中,我们想将上面的链接简化为http://example.com/shirt/summer。并且让shirtsummer参数值仍然存在,但没有查询字符串和脚本名称。

以下是实现此目的的一条规则:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^shirt/summer$ results.php?item=shirt&season=summer [QSA]

shirt/summer在请求的地址被明确的匹配而且Apache被告知去服务results.php?item=shirt&season=summer

[QSA]标志在重写规则经常被用到。它们告诉Apache将任何其他查询字符串附加到提供的URL,因此如果访问者输入http://example.com/shirt/summer?page=2,服务器将用该地址results.php?item=shirt&season=summer&page=2来响应。如果没有它,额外的查询字符串将被丢弃。

虽然此方法可实现所需效果,但项目名称和季节都硬编码到规则中。这意味着该规则不适用于任何其他items,比如pants,或seasons,比如winter

为了使规则更通用,我们可以使用正则表达式匹配原始地址的各个部分,并在替换模式中使用这些部分。修改后的规则将如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2 [QSA]

括号中的第一正则表达式组与包含字母数字字符,例如shirtpants,和数字等的字符串相匹配并将匹配片段保存为$1变量。括号中的第二正则表达式组与summerwinterfall,或spring完全匹配并且类似的将匹配保存为$2变量。

然后将匹配的片段用于生成的URL中的 itemseason变量,而不是使用之前的硬编码的shirtsummer的值。

例如,上面将把http://example.com/pants/summer转换为http://example.com/results.php?item=pants&season=summer。此示例也是也是具有前瞻性的,允许使用单个规则正确地重写多个项目和季节。

示例2 - 使用RewriteConds添加逻辑条件

重写规则不一定总是逐个评估,没有任何限制。该RewriteCond指令允许我们为重写规则添加条件,以控制何时处理规则。全部RewriteConds应该遵守以下格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteCond TestString Condition [Flags]
  • RewriteCond指定RewriteCond指令。
  • TestString 是要测试的字符串。
  • Condition 是匹配的模式或条件。
  • Flags 是可选参数,可以修改条件和评估规则。

如果RewriteCond评估为true,则将考虑紧随其后的RewriteRule。如果不相关,则该规则将被丢弃。多个RewriteCond可可以一个接一个的使用,并且,对于默认行为,所有的值都必须为true,才能考虑下面的规则。

例如,假设您希望将所有请求重定向到您站点上不存在的文件或目录,并将其重定向到主页,而不是显示标准的404 Not Found错误页面。这可以通过以下条件规则来实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

有了上述:

  • %{REQUEST_FILENAME}是要检查的字符串。在这种情况下,它是请求的文件名,它是可用于每个请求的系统变量。
  • -f是一个内置条件,它验证所请求的名称是否存在于磁盘上并且是一个文件。该!是一个否定运算符。合并后,!-f仅当指定的名称不存在或不是文件时才计算结果为true。
  • 同样,仅当指定的名称不存在或不是目录时,!-d的评估结果才为true。

在最终线的RewriteRule只为=有当请求不存在的文件或目录时才将生效。该RewriteRule本身非常简单,并且可以将每个请求重定向到/网站的根目录。

结论

mod_rewrite允许您创建人类可读的URL。在本教程中,您学习了如何使用该RewriteRule指令重定向URL,包括具有查询字符串的URL。您还学习了如何使用该RewriteCond指令有条件地重定向URL 。

更多Ubuntu 教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Rewrite URLs with mod_rewrite for Apache on Ubuntu 18.04》

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在Debian 9上使用mod_rewrite为Apache重写URL
Apache的mod_rewrite模块允许您以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。它还允许您根据条件重写URL。
楠宝宝
2018/11/15
5.5K0
如何在Ubuntu 14.04上为Apache设置mod_rewrite
在本教程中,我们将激活并学习如何使用Apache2 mod_rewrite模块管理URL重写。这个工具允许我们以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。
无敌小笼包
2018/10/19
2.7K0
如何在Debian 8上使用mod_rewrite为Apache重写URL
在本教程中,我们将激活并学习如何使用Apache 2的mod_rewrite块管理URL重写。该模块允许我们以更干净利落的方式重写URL,将人们可读的路径转换为代码友好的查询字符串或根据其他条件重定向URL。
陈树丶
2018/08/09
4.9K0
如何在CentOS 7上为Apache设置mod_rewrite
Apache是一个模块化Web服务器,允许您通过启用和禁用模块来自定义其功能。这使管理员能够定制Apache的功能以满足其Web应用程序的需求。
SQL GM
2018/10/19
5.9K0
Apache URL重写规则
  Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块。它的功能非常强大,可以操作URL中的所有部分。
那一叶随风
2018/08/22
3.2K0
Apache URL重写规则
Apache rewrite Url
本文主要介绍Apache环境下,如何使用mod_rewrite模块完成URL重写功能。
黄啊码
2020/05/31
1.9K0
Apache的URL地址重写(RewriteCond与RewriteRule)
大家好,又见面了,我是你们的朋友全栈君。Apache的URL地址重写 http://hi.baidu.com/sonan/blog/item/c408963d89468208bba16716.html 第一种方法:Apache环境中如果要将URL地址重写,正则表达式是最基本的要求,但对于一般的URL地址来说,基本的匹配就能实现我们大部分要求,因此除非 是非常特殊的URL地址,但这不是我要讨论的范围,简单几招学会Apache中URL地址重写,通过实例展示,轻松学会URL地址重写: URL实例
全栈程序员站长
2022/06/30
2.6K0
Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结(完整版)
一. 简单实例介绍 一般来说,apache配置好http和https后,如果想要做http强转到https,需要设置url重定向规则,大致需要下面几个步骤即可完成配置:
洗尽了浮华
2018/09/28
32.3K0
Apache 模块 mod rewrite RewriteCond 通过检查HTTP REFERER避免
在避免静态图片盗链时,可以用RewriteCond检查referer,如果不是来自于特定的网站或搜索引擎,则转向另一个页面。在使用这些 RewriteCond和不使用之间作比较,每条RewriteCond将降低速度1%以上,随着这个列表的增长,对于速度的影响将进一步突出。因此使用 大量RewriteCond来保护静态内容的方案,虽然能减和网络流量,但是也会消耗服务器性能。在具体使用过程中一定要平衡各方面条件。
全栈程序员站长
2022/08/27
1.8K0
apache rewritecond_hfile数据格式中的data字段用于
RewriteCond就像我们程序中的if语句一样,表示如果符合某个或某几个条件则执行RewriteCond下面紧邻的RewriteRule语句,这就是RewriteCond最原始、基础的功能,为了方便理解,下面来看看几个例子。
全栈程序员站长
2022/08/18
4.6K0
Apache rewrite的重写相关的参数说明
Apache的rewrite的重写非常常用,现总结了一下.Apache mod_rewrite规则重写的标志一览
习惯说一说
2019/07/16
1.2K0
PHP扩展模块、Apache之rewrite模块
说明: 在配置文件中加入“extension=redis.so”即可!该文件中“;”表示注释符号,同“#”。
阿dai学长
2019/04/03
2.4K0
Apache中 RewriteRule 规则参数介绍
大家好,又见面了,我是你们的朋友全栈君。Apache中 RewriteRule 规则参数介绍
全栈程序员站长
2022/08/27
12.4K0
Apache URL重定向
Apached的重写功能,即是mod_rewrite模块功能,它是apache的一个模块。它的功能非常强大,可以操作URL中的所有部分。通过改写url,给用户提供一个简介大方的url,当用户访问时可以通过mod_rewrite模块功能转换为真正的资源路径。通过mod_rewrite能实现的功能还有很多,例如隐藏真实地址、实现URL跳转、域名跳转、防盗链、限制访问资源类型等等。
星哥玩云
2022/09/15
5.7K0
Apache中 RewriteCond 规则参数介绍[通俗易懂]
Apache中 RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结果,这次我终于算大概知道它的意思了。 RewriteCond就像我们程序中的if语句一样,表示
全栈程序员站长
2022/06/29
4.9K0
Apache 的 ReWrite 的应用
Apache的mod_rewrite是提供了强大URL操作的杀手级 的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和运用,即使 是Apache专家有时也会发掘出mod_rewrite的新用途。 换句话说:对mod_rewrite,或者是打退堂鼓永不再用,或者是喜欢它并一生受用。 ReWrite可以应用在以下方面或者解决以下问题: URL的规划 规范的URL 说明: 在有些网站服务器上,一个资源会拥有多个URL,在实
wangxl
2018/03/07
1.5K0
Apache 中RewriteRule 规则参数[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。[size=medium] Apache 中RewriteRule 规则参数 Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
全栈程序员站长
2022/08/28
3.6K0
由浅入深剖析.htaccess
.htaccess的主要作用就是实现url改写,也就是当浏览器通过url访问到服务器某个文件夹时,作为主人,我们可以来接待这个url,具体地怎样接待它,就是此文件的作用。所有的访问都是通过URL实现,所以.htaccess的作用非同小可。正因为此,所以一般地网站通过设置.htaccess,通过一个十分友好的url吸引用户进来,然后用.htaccess把用户带到需要访问的位置。
Java架构师必看
2021/03/22
5.2K0
【译】使用Apache的mod重写来保护你的C2 Empire
背景 伴随着维基红色团队基础架构(Red Team Infrastructure Wiki)的发布,今年圣诞节早早来临。 它在Jeff Dimmock和Steve Borosh的惊人的红色团队基础架构介绍之后正式亮相。 在设计和保护基础架构时,我甚至无法理解维基有多高的价值,以下是我的观点: 维基强调的一个关键设计因素是在基础架构设置中使用重定向器(redirectors)。重定向(redirection)几乎可以应用于基础架构的所有功能,包括服务负载、避免IR和在其他服务器中保护你的C2服务器。损失一台
安恒网络空间安全讲武堂
2018/02/06
1.7K0
【译】使用Apache的mod重写来保护你的C2 Empire
RewriteCond和13个mod_rewrite应用举例Apache伪静态
大家好,又见面了,我是你们的朋友全栈君。 1.给子域名加www标记 RewriteCond %{HTTP_HOST} ^([a-z.]+)?example.com$ [NC] Rewri
全栈程序员站长
2022/09/06
4K0
相关推荐
如何在Debian 9上使用mod_rewrite为Apache重写URL
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档