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 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
分享一位同学的阿里、百度前端面经
从决定找工作开始,我其实经历过一系列思想斗争,最开始想的是,等自己完全准备充分之后,再开始投简历面试。然而,由于惰性,我发现自己很难判断什么时候是完全准备好的时候。
zz_jesse
2020/12/08
8970
百度2018年春招实习面经,回馈牛客【实习offer已到手】
写在之前 从2017年10月左右就一直在牛客上刷题,然后计划着找实习。持续关注着牛客网的讨论区,看招聘信息,看面经,看技术交流,就想着要不断充实自己。 几乎每天都要上牛客,不是刷题就是看帖子,一直持续了好几个月,直到有一天看到一位牛友发布的百度垂直行业搜索部的实习生招聘 https://www.nowcoder.com/discuss/65718 仔细阅读了职位要求之后,发现还是比较符合自己预期的,就果断开始写简历投递了。投递详情:垂直行业搜索部-机器学习岗 这就开始了我读研以来的第一次求职之旅。 2.时间
牛客网
2018/04/28
1.5K0
腾讯SNG的实习offer(多篇面经分享)
本人双非一本,春招实习投的岗位是后端开发(主要是C++和Go),平时做项目用的语言都是Go,简历上的项目都是Go web(已经上线了),没有C++的项目经验。现在拿到了腾讯SNG后台开发的实习offer。下面是我的春招找实习的经历。 百度 这里先感谢下在百度工作的师兄,谢谢他的内推,我正式投百度连笔试机会都没有。 百度是我春招面的第一家,3月初就来了电话。当时还没开始复习,慌的不行。 下面是面经。 2018-3-12 一面(电面50多分钟) 为什么喜欢后端开发? 你觉得创新班怎么样?在创新班
牛客网
2018/07/04
9890
字节跳动前端面试经历及总结
你好,我是星辉,幸会幸会。 今天我参加了字节跳动的前段视频第一次面试,把它记录总结下来,希望能够对大家带来帮助。
星辉
2019/01/15
3.3K0
金三银四百度前端实习面经
金三银四百度前端实习面经 前段时间(4.10)面了百度的前端暑假实习,来分享一下面经。 一面 JS 中怎么判断两个值相等 px 和 em 两个单位的区别 CSS 选择器按权重排序 ::after 是伪元素还是伪类选择器 伪元素一般可以用来做什么 iconfont 是什么 promise 输出题 React 事件和原生事件的执行顺序 React Hooks 在使用上有哪些限制 手写数组扁平化 flat 如何获取一个实例对象的原型 内容分发网络 CDN 浏览器状态码 304 浏览器缓存机制 跨域问题 cooki
用户8921923
2022/10/24
5250
我的第一份实习!附面试初体验
很多小伙伴私信问我些关于找实习的问题,比如学编程到什么程度可以找实习?到哪儿能找到实习?实习时一般都干点啥?我的技术太菜,实习时会不会啥都干不了?实习能让我学到啥?对我的技术提升有没有帮助?
程序员鱼皮
2021/05/18
7690
便利蜂内推电话面
昨天,突然接到了便利蜂内推成功约面的电话,要我今天去面试,这是春招头一个面试电话呀,很是激动,这得感谢牛客那个便利蜂发了内推邮箱的不认识的小哥哥的帖子吧。 结果我很怂,想推到周一,周末还能再准备准备,然后一本正经跟hr小哥哥说我今天还有两个面试,上午下午各一个,hr小哥哥瞬间乐了(乐啥呢,没明白),说没事,我们可以电话或者视频面,明天下午(也就是今天下午)的5点-6点有空吗,我说可以(反正能拖多久是多久,知足吧),后来就给我发了面试邀请邮件,看到面试官是个小姐姐的名字,感觉好腻害,同样是女生,我咋就这么菜呢
牛客网
2018/04/28
1.3K0
便利蜂内推电话面
记一次网易前端实习面试
很幸运地能收到网易的面试通知,就毫不犹豫翘了课去面试了hhhh~三点的面试,因为从来没去过那个中关村西北旺区,吃完饭早早就去了,想象中那里应该是繁华的地方hhhh,到了发现都在建设中,很多还在建设中,看到了网易旁边的百度和搜狐,都是长长的大楼或者是高高的建筑,满满大企业的既视感~一进网易楼就没网= =,在里面也没事干,就呆在外面看看前端的东西准备下,到2点40的时候跟前台说了下,一个网易年轻姐姐就带我上去了~
疯狂的技术宅
2019/03/27
6970
一位大佬蚂蚁金服2019实习生面经总结(已拿口头offer)
一面是上海的小哥打来的,3.12号中午确认的内推,下午就打来约时间了,也是唯一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。
帅地
2019/06/06
1.2K0
一位大佬蚂蚁金服2019实习生面经总结(已拿口头offer)
我的 Web 前端面试经历——百度
面试是个漫长的过程,从海投到收获电话面试,一面、二面、三面,一个步骤出错那么后面就宣告终结。同时,面试过程中你也可能会遇到一些面试官的刁难,甚至部分面试官会说些比较打击你的话,但是大部分面试官都是很棒的!
李才哥
2019/07/10
6760
我的 Web 前端面试经历——百度
从0offer到一天谈完薪资,几乎结束秋招,前端面经回馈牛客
个人是双非渣本,没有实习经历,但是自己的项目经验巨多,之前是搞算法的,后来转向前端
牛客网
2018/12/13
1K0
俺实习和秋招的面经
面试官是 nlp 方向的,所以确实对图像了解的并不多,整个过程几乎都是让我在介绍我的工作
棒棒鸡不棒
2022/09/02
7390
前端面试经常被问的题目,自己总结了一下
变量提升的表现是,无论在函数中何处位置声明的变量,好像都被提升到了函数的首部,可以在变量声明前访问到而不会报错。
loveX001
2022/09/24
4120
应届渣渣前端面经(还有游戏策划以及鸡汤)
前言   本来不准备发的,可是看着自己写了半年的面经,不发呢就让他烂在电脑里,发的话呢,又给各位大佬献丑,后来觉得还是可惜,那还是发吧。 大学四年,方向都是不固定,身边大部分人思想放不开,永远想着专业对口, 又放任自己,我显得不合群。大一想创业,后来发现家里没经商背景没经验,0社会经验创业这是扯淡。大二做了数学建模,开始做得好好的,拿下很多奖,最后队友居然弃坑,然而后期大家都是已经组好队,是找不到3个人组成一个队的了,又放弃了。大三开始做游戏策划,做了几个月又经历了秋招,结果发现自己真心的并不是喜欢做策划
牛客网
2018/07/04
5.7K0
2020字节跳动抖音架构组前端实习生面经(已到offer)
个人背景: 武汉理工大学(211)计算机系大三下,准备找实习。最近找大佬内推,投了北京字节跳动,据说是非常核心的一个小组,要求很高。
@超人
2021/02/26
8720
2020字节跳动抖音架构组前端实习生面经(已到offer)
横扫9家大厂前端校招offer
我就读于北京理工大学软件工程专业,是一名大四学生。从大一开始投入以前端为主的全栈开发,独立开发过多个中型和小型项目,是 佬铁|宿舍市集 小程序的社区创始人及独立项目负责人。
前端迷
2019/09/09
1.4K0
面试|2021 菜鸟金三银四铜五 Android 被锤历程出炉...
对于跳槽,个人其实相对比较抵触,相比来来回回跳,内心更趋向于随着公司的成长而成长...
贺biubiu
2021/09/07
9890
记录年前Java岗整个历程(附字节,阿里,百度,网易,美团等面经)
211本,985硕,女生,方向都是Java开发或者后台开发。   目前拿到了字节,百度,网易(白菜价,已拒),美团,小米的意向书,等最终结果通知的是华泰(已收到体检通知),招行信用卡,阿里   招银(资料审查中),网易互娱(二面没去),浦发(没去体检),农行(面试通过,没去笔试),腾讯(两次被捞都是一面挂,第三次还是深圳拒绝了面试),微软(笔试完),银联(笔试完),微博(拒绝了现场面试)   还有各种笔试挂的(流利说,爱奇艺,小红书,B站),后续拒绝了很多面试,再也没有精力再去了,持续躺尸中.... 实习
Java码农那些事
2020/02/15
1K0
迟来的2020年度总结,顺带附上被鸽了很久的自我介绍
大家好,我是小澎,一个热爱前端的2021届的应届毕业生,大学专业是安全工程,不,不是网络安全,而是工程安全,所以我是非科班。今天呢,想跟大家介绍介绍我自己
@零一
2021/05/14
3940
迟来的2020年度总结,顺带附上被鸽了很久的自我介绍
身为三本的我就是凭借这些前端面试题拿到百度京东offer的,前端面试题2021及答案「建议收藏」
顺便,如果有错误的地方请各位一定要指出,免得误导更多人。 接下来的题我会根据重点程度使用⭐来标记,⭐越多标明越重点,满星是5颗星 ok,你准备好了吗?咱们开始吧!
全栈程序员站长
2022/07/23
8600
身为三本的我就是凭借这些前端面试题拿到百度京东offer的,前端面试题2021及答案「建议收藏」
推荐阅读
相关推荐
分享一位同学的阿里、百度前端面经
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验