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

如何在Ubuntu 14.04上为Apache设置mod_rewrite

原创
作者头像
无敌小笼包
修改于 2018-10-22 03:41:01
修改于 2018-10-22 03:41:01
2.9K00
代码可运行
举报
运行总次数:0
代码可运行

介绍

在本教程中,我们将激活并学习如何使用Apache2 mod_rewrite模块管理URL重写。这个工具允许我们以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。

本指南分为两部分:第一部分设置示例Web应用程序,第二部分解释常用的重写规则。

准备

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu 服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器

第1步 - 安装Apache

在此步骤中,我们将使用一个名为apt-get的内置包安装程序。它大大简化了管理并简化了安装。

首先,更新系统的包索引。这将确保旧的或过时的包不会干扰安装。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get update

Apache2是前面提到的HTTP服务器,也是世界上最常用的。要安装它,请运行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sudo apt-get install apache2

第2步 - 启用mod_rewrite

现在,我们需要激活mod_rewrite

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

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

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

第3步 - 设置.htaccess

在本节中,我们将设置一个.htaccess文件,以便进行更简单的重写规则管理。

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

在我们开始之前,我们需要设置并确保更多设置。

首先,允许更改.htaccess文件。使用nano或您喜欢的文本编辑器打开默认的Apache配置文件。

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

在该文件中,您将在第1行找到该<VirtualHost *:80>块。在该块的内部,添加以下块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<Directory /var/www/html>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride All
                Order allow,deny
                allow from all
</Directory>

您的文件现在应该与以下内容匹配。确保所有块都正确缩进。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<VirtualHost *:80>
    <Directory /var/www/html>. . .</Directory>. . .
</VirtualHost>

要使这些更改生效,请重新启动Apache。

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

现在,创建.htaccess文件。

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

在新文件的顶部添加第一行以激活RewriteEngine

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

保存并退出该文件。

要确保其他用户只能读取您的用户.htaccess,请运行以下命令以更新权限。

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

您现在有一个操作.htaccess文件来管理Web应用程序的路由规则。

第4步 - 设置文件

在本节中,我们将设置一个基本的URL重写,它将漂亮的URL转换为代码的实际路径。具体来说,我们将允许用户访问example.com/about

我们将从创建一个名为的文件开始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>

您可以访问your_server_ip/about.htmlexample.com/about.html访问您的Web应用程序。现在注意到只有about.html可访问; 如果您尝试访问your_server_ip/about,则会收到Not Found错误。我们希望用户访问about。我们的重写规则将允许这个功能。

打开.htaccess文件。

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

在第一行之后,添加以下内容。

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

您的文件现在应该与以下内容相同。

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

恭喜。您现在可以example.com/about在浏览器中访问!

这是一个很好的简单示例,显示了所有重写规则遵循的一般语法。

^about$是从URL匹配的字符串。也就是说,这是观众在她的浏览器中输入的内容。我们的示例使用了一些元字符

  • example.com/剥离后^表示URL的开头。
  • $ 表示URL的结尾
  • about 匹配字符串“约”

about.html是用户访问的实际路径; 也就是说,Apache仍将提供该about.html文件。

[NC]是一个忽略URL中大写的标志

使用上面显示的规则,以下URL将指向about.html

  • example.com/about
  • example.com/About
  • example.com/about.html

以下不会:

  • example.com/about/
  • example.com/contact

常见模式

在本节中,我们将展示一些常用的指令。

您的Web应用程序现在正在运行,并受受保护.htaccess文件的约束。最简单的例子如上所述。我们将在本节中探讨另外两个示例。

如果您愿意,可以在结果路径中设置示例文件,但本教程不包括创建HTML和PHP文件; 只是重写的规则。

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

所有人都RewriteRule遵循以下格式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteRule pattern substitution [flags]
  • RewriteRule:指定指令RewriteRule
  • pattern:与所需字符串匹配的正则表达式
  • substitution:实际URL的路径
  • flags:可以修改规则的可选参数

Web应用程序通常使用查询字符串,这些字符串使用?问号附加到URL 并使用&&符号分隔。匹配重写规则时会忽略它们。但是,有时可能需要查询字符串来在页面之间传递数据。例如,用PHP编写的搜索结果页面可能会使用类似于以下内容的内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/results.php?item=shirt&season=summer

在这个例子中,我们希望将其简化为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/shirt/summer

例1A:简单的替换

使用重写规则,我们可以使用以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/var/www/html/.htaccessRewriteRule ^shirt/summer$ results.php?item=shirt&season=summer

以上是相当不言自明的,因为它实际上映射shirt/summerresults.php?item=shirt&season=summer。这实现了我们期望的效果。

例1B:匹配选项

但是,我们想将此概括为包括所有季节。因此,我们将执行以下操作:

  • 使用|布尔值指定一系列选项,意思是“OR”
  • 匹配使用组(),然后使用引用组$1,与1用于第一个匹配组

重写规则现在变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/var/www/html/.htaccessRewriteRule ^shirt/(summer|winter|fall|spring) results.php?item=shirt&season=$1

上面显示的规则匹配shirt/指定季节后面的URL 。该季节使用分组(),然后$1在后续路径中引用。这意味着,例如,:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/shirt/winter

变为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/results.php?item=shirt&season=winter

这也实现了期望的效果。

示例1C:匹配字符集

但是,我们还要指定任何类型的项目,而不仅仅是URL /shirt。因此,我们将执行以下操作:

  • 编写一个匹配所有字母数字字符的正则表达式。括号表达式[]匹配其中的任何字符,并+匹配括号中指定的任意数量的字符
  • 对匹配进行分组,并将其$2作为文件中的第二个变量引用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/var/www/html/.htaccessRewriteRule ^([A-Za-z0-9]+)/(summer|winter|fall|spring) results.php?item=$1&season=$2

以上将转换,例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/pants/summer

至:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/results.php?item=pants&season=summer

示例1D:传递查询字符串

本节不介绍任何新概念,但解决了可能出现的问题。使用上面的示例,假设我们想重定向http://example.com/pants/summer但会传递一个额外的查询字符串?page=2。我们想要以下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/pants/summer?page=2

映射到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://example.com/results.php?item=pants&season=summer&page=2

如果您尝试使用我们当前的设置访问上述URL,您会发现查询字符串page=2丢失了。使用附加QSA标志可以轻松修复此问题。修改重写规则以匹配以下内容,并将实现所需的行为。

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

示例2:使用逻辑添加条件

RewriteCond让我们为我们的重写规则添加条件。所有人都RewriteCond遵循以下格式:

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

如果RewriteCond评估为true,RewriteRule则将考虑紧随其后的内容。

例2A:默认页面

在假想的管理面板中,我们可能希望将所有格式错误的URL指向主页,而不是用404问候用户。使用条件,我们可以检查所请求的文件是否存在。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^admin/(.*)$ /admin/home

这将重定向像/admin/blargh/admin/home

有了上述:

  • %{REQUEST_FILENAME} 是要检查的字符串
  • !-f在文件名上使用!not运算符
  • RewriteRule 将所有请求重定向回 /admin/home

请注意,在语法和技术上更正确的方法是定义404 ErrorDocument

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ErrorDocument 404 /error.html

例2B:IP访问限制

虽然这也可以使用其他方法实现,但是RewriteCond可以使用a来限制对一个IP或一组IP地址的访问。

此示例阻止来自 12.34.56.789 之外的所有位置的流量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
RewriteCond %{REMOTE_ADDR} !^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

整个声明显示“如果地址不是 12.34.56.789,则不允许访问”。

简而言之:

  • %{REMOTE_ADDR} 是地址字符串
  • !^(12\.34\.56\.789)$``.使用\反斜杠转义所有句点并使用取消IP地址!
  • F标志禁止访问L,如果执行,则该标志表示这是最后运行的规则

如果您宁愿阻止 12.34.56.789,请改用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/var/www/html/.htaccessRewriteCond %{REMOTE_ADDR} ^(12\.34\.56\.789)$
RewriteRule (.*) - [F,L]

结论

mod_rewrite可以有效地用于确保人类可读的URL。然而,.htaccess文件本身比简单的模块有更多的用途,应该注意的是,可以安装许多其他Apache模块来扩展其功能。

还有其他资源详细说明了以下功能mod_rewrite

mod_rewrite是Web应用程序安全性的关键模块,但有时可能会出现重定向循环或无处不在的模糊500 forbidden错误。有关调试的提示.htaccess,请参阅此StackOverflow帖子

为了快速分析正则表达式模式,这里有一个在线调试器,可以提供正则表达式模式的即时反馈和实时解释。

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


参考文献:《How To Set Up mod_rewrite for Apache on Ubuntu 14.04》

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
如何在Debian 9上使用mod_rewrite为Apache重写URL
Apache的mod_rewrite模块允许您以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。它还允许您根据条件重写URL。
楠宝宝
2018/11/15
5.8K0
如何在Ubuntu 18.04上使用mod_rewrite for Apache重写URL
Apache的mod_rewrite模块允许您以更干净的方式重写URL,将人类可读的路径转换为代码友好的查询字符串。它还允许您根据条件重写URL。
水门
2018/10/19
5.1K0
如何在CentOS 7上为Apache设置mod_rewrite
Apache是一个模块化Web服务器,允许您通过启用和禁用模块来自定义其功能。这使管理员能够定制Apache的功能以满足其Web应用程序的需求。
SQL GM
2018/10/19
6.1K0
Apache 的 ReWrite 的应用
Apache的mod_rewrite是提供了强大URL操作的杀手级 的模块,可以实现几乎所有你梦想的URL操作类型,其代价是你必须接受其复杂性,因为mod_rewrite的主要障碍就是初学者不容易理解和运用,即使 是Apache专家有时也会发掘出mod_rewrite的新用途。 换句话说:对mod_rewrite,或者是打退堂鼓永不再用,或者是喜欢它并一生受用。 ReWrite可以应用在以下方面或者解决以下问题: URL的规划 规范的URL 说明: 在有些网站服务器上,一个资源会拥有多个URL,在实
wangxl
2018/03/07
1.5K0
如何在Debian 8上使用mod_rewrite为Apache重写URL
在本教程中,我们将激活并学习如何使用Apache 2的mod_rewrite块管理URL重写。该模块允许我们以更干净利落的方式重写URL,将人们可读的路径转换为代码友好的查询字符串或根据其他条件重定向URL。
陈树丶
2018/08/09
5.1K0
Apache mod_rewrite实现HTTP和HTTPS重定向跳转
当你的站点使用了HTTPS之后,你可能会想把所有的HTTP请求(即端口80的请求),全部都重定向至HTTPS(即端口443)。这时候你可以用以下的方式来做到:(Apache mod_rewrite)
用户8965210
2021/10/14
1.5K0
Apache常用配置-运维笔记
===========================.htaccess文件配置笔记=========================== .htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过对.htaccess文件进行设置,可以帮我们实现:网页301重定向、自定义400/403/404/500错误页面、改变文件扩展名、允许/阻止指定IP用户访问、禁止目录列表、配置默认文档等功能,可以说是功能非常强大。
洗尽了浮华
2018/10/22
2.9K0
Apache之Rewrite和RewriteRule规则梳理以及http强转https的配置总结(完整版)
一. 简单实例介绍 一般来说,apache配置好http和https后,如果想要做http强转到https,需要设置url重定向规则,大致需要下面几个步骤即可完成配置:
洗尽了浮华
2018/09/28
32.6K0
RewriteCond指令格式
语法: RewriteCond TestString CondPattern [flags]
全栈程序员站长
2022/07/01
2.7K0
Apache 中RewriteRule 规则参数[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。[size=medium] Apache 中RewriteRule 规则参数 Apache模块 mod_rewrite 提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求。它支持每个完整规则可以拥有不限数量的子规则以及附加条件规则的灵活而且强大的URL操作机制。此URL操作可以依赖于各种测试,比如服务器变量、环境变量、HTTP头、时间标记,甚至各种格式的用于匹配URL组成部分的查找数据库。
全栈程序员站长
2022/08/28
3.7K0
Apache中 RewriteRule 规则参数介绍
大家好,又见面了,我是你们的朋友全栈君。Apache中 RewriteRule 规则参数介绍
全栈程序员站长
2022/08/27
12.6K0
.htaccess伪静态规则
Apache的 mod_rewrite是比较强大的,在进行网站建设时,可以通过这个模块来实现伪静态。
阿珏
2018/08/02
5.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.7K0
Apache中 RewriteCond 规则参数介绍[通俗易懂]
Apache中 RewriteCond语句对于我来说一直是个难点,多次试图去把它搞明白,都没有结果,这次我终于算大概知道它的意思了。 RewriteCond就像我们程序中的if语句一样,表示
全栈程序员站长
2022/06/29
5K0
【译】使用Apache的mod重写来保护你的C2 Empire
背景 伴随着维基红色团队基础架构(Red Team Infrastructure Wiki)的发布,今年圣诞节早早来临。 它在Jeff Dimmock和Steve Borosh的惊人的红色团队基础架构介绍之后正式亮相。 在设计和保护基础架构时,我甚至无法理解维基有多高的价值,以下是我的观点: 维基强调的一个关键设计因素是在基础架构设置中使用重定向器(redirectors)。重定向(redirection)几乎可以应用于基础架构的所有功能,包括服务负载、避免IR和在其他服务器中保护你的C2服务器。损失一台
安恒网络空间安全讲武堂
2018/02/06
1.8K0
【译】使用Apache的mod重写来保护你的C2 Empire
php 实现url rewrite 伪静态
mod_rewrite是Apache的一个非常强大的功能,它可以实现伪静态页面。下面我详细说说它的使用方法!对初学者很有用的哦!
lilugirl
2019/05/26
2.9K0
Nginx/Apache之伪静态设置 - 运维小结
一、什么是伪静态 伪静态即是网站本身是动态网页如.php、.asp、.aspx等格式动态网页有时这类动态网页还跟"?"加参数来读取数据库内不同资料,伪静态就是做url重写操作(即rewrite)。很典
洗尽了浮华
2019/05/25
13.4K0
Apache 模块 mod rewrite RewriteCond 通过检查HTTP REFERER避免
在避免静态图片盗链时,可以用RewriteCond检查referer,如果不是来自于特定的网站或搜索引擎,则转向另一个页面。在使用这些 RewriteCond和不使用之间作比较,每条RewriteCond将降低速度1%以上,随着这个列表的增长,对于速度的影响将进一步突出。因此使用 大量RewriteCond来保护静态内容的方案,虽然能减和网络流量,但是也会消耗服务器性能。在具体使用过程中一定要平衡各方面条件。
全栈程序员站长
2022/08/27
1.8K0
Apache重载规则详解[一]
1、先写个简单的重载规则(具体环境配置参考 http://www.0377joyous.com/archives/109.html) 2、在网站目录(我在网站根目录下做测试)下建立htaccess文
苦咖啡
2018/05/07
1.2K0
Apache rewrite的重写相关的参数说明
Apache的rewrite的重写非常常用,现总结了一下.Apache mod_rewrite规则重写的标志一览
习惯说一说
2019/07/16
1.2K0
相关推荐
如何在Debian 9上使用mod_rewrite为Apache重写URL
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验