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

默认的话 Apache是关闭的.

转自该链接


介绍

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

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

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

安装Apache。

第1步 - 启用mod_rewrite

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

sudo a2enmod rewrite

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

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配置文件。

sudo nano/etc/apache2/sites-available/000-default.conf

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

<VirtualHost*:80><Directory/var/www/html>Options Indexes FollowSymLinks MultiViews        AllowOverride All        Require all granted</Directory>​...</VirtualHost>

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

sudo systemctl restart apache2

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

sudo nano/var/www/html/.htaccess

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

RewriteEngine on

保存文件并退出。

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

第3步 - 配置URL重写

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

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

sudo nano/var/www/html/about.html

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

<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都应遵循以下格式:

RewriteRule pattern substitution[flags]

RewriteRule指定指令。

pattern是一个正则表达式,匹配URL中所需的字符串,这是查看器在浏览器中键入的内容。

substitution是实际URL的路径,即文件Apache服务器的路径。

flags是可以修改规则工作方式的可选参数。

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

sudo nano/var/www/html/.htaccess

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

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

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

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

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。

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

RewriteRule^([A-Za-z0-9]+)/(summer|winter|fall|spring)results.php?item=$1&season=$2[QSA]

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

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

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

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

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

RewriteCond TestString Condition[Flags]

RewriteCond指定RewriteCond指令。

TestString是要测试的字符串。

Condition是匹配的模式或条件。

Flags是可选参数,可以修改条件和评估规则。

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

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

RewriteCond%{REQUEST_FILENAME}!-fRewriteCond%{REQUEST_FILENAME}!-dRewriteRule./

有了上述:

%{REQUEST_FILENAME}是要检查的字符串。在这种情况下,它是请求的文件名,它是可用于每个请求的系统变量。

-f是一个内置条件,它验证所请求的名称是否存在于磁盘上并且是一个文件。该!是一个否定运算符。合并后,!-f仅当指定的名称不存在或不是文件时才计算结果为true。

同样,仅当指定的名称不存在或不是目录时,!-d的评估结果才为true。

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

结论

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容