如何在 Ubuntu 16.04 上使用 mod_rewrite 重写 Apache 的 URL

news2024/10/23 6:22:30

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介

在本教程中,我们将激活并学习如何使用 Apache 2 的 mod_rewrite 模块来管理 URL 重写。该模块允许我们以更清晰的方式重写 URL,将人类可读的路径转换为对代码友好的查询字符串,或者基于额外条件重定向 URL。

本指南分为两部分。第一部分设置一个示例网站,并涵盖一个简单的重写示例。第二部分包含两个更深入的常用重写规则示例。

先决条件

要遵循本教程,您需要:

  • 一个安装了 Ubuntu 16.04 服务器,按照初始服务器设置教程进行设置,包括一个具有 sudo 非根用户和防火墙的服务器。
  • 通过按照在 Ubuntu 16.04 上安装 Linux、Apache、MySQL、PHP(LAMP)堆栈的第 1 步来在服务器上安装 Apache 2。

第 1 步 —— 启用 mod_rewrite

首先,我们需要激活 mod_rewrite。在干净的 Apache 2 安装中,该模块是可用但未启用的。

sudo a2enmod rewrite

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

sudo systemctl restart apache2

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

第 2 步 —— 设置 .htaccess

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

我们需要在开始之前设置和保护一些其他设置。

默认情况下,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

保存文件并退出。

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

第 3 步 —— 配置 URL 重写

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

首先,在 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,您将看到 404 Not Found 错误。如果您希望用户仅使用 about 访问页面,则重写规则将允许此功能。

所有 RewriteRules 遵循以下格式:

RewriteRule pattern substitution [flags]
  • RewriteRule 指定指令。
  • pattern 是一个正则表达式,用于匹配 URL 中的所需字符串,即浏览器中用户键入的内容。
  • substitution 是实际 URL 的路径,即 Apache 服务器的文件路径。
  • flags 是可选参数,可以修改规则的工作方式。

打开 .htaccess 文件。

sudo nano /var/www/html/.htaccess

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

RewriteEngine on
RewriteRule ^about$ about.html [NC]

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

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

现在,您应该能够在浏览器中访问 http://your_server_ip/about。实际上,根据上述规则,以下 URL 将指向 about.html

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

以下将不会:

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

现在,您有一个具有简单规则的可操作的 .htaccess 文件,您可以根据需要修改和扩展它。在接下来的几节中,我们将展示两个常用指令的其他示例。

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

Web 应用程序通常使用 查询字符串,它们是通过在地址后面使用问号 (?) 添加的。不同的参数使用和号 (&) 分隔。查询字符串可用于在单个应用程序页面之间传递附加数据。

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

Apache 重写规则通常用于简化上述长且不友好的链接,将其转换为更容易输入和视觉解释的 友好 URL。在这个例子中,我们希望简化上述链接,变成 http://example.com/shirt/summershirtsummer 参数值仍然在地址中,但没有查询字符串和脚本名称。

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


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。如果没有这个标志,额外的查询字符串将被丢弃。

虽然这种方法实现了期望的效果,但项目名称和季节都是硬编码到规则中的。这意味着该规则对于其他项目(如 pants)或季节(如 winter)将无法工作。

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


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

括号中的第一个正则表达式组匹配包含字母数字字符的字符串,如 shirtpants,并将匹配的片段保存为 $1 变量。括号中的第二个正则表达式组匹配 summerwinterfallspring,类似地将匹配的片段保存为 $2

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

上述规则将例如 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 评估为真,则紧随其后的 RewriteRule 将被考虑。如果不是,则规则将被丢弃。可以连续使用多个 RewriteCond,并且默认行为下,所有条件必须都为真才能考虑后续规则。

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


RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /

使用上述规则:

  • %{REQUEST_FILENAME} 是要检查的字符串。在这种情况下,它是请求的文件名,这是每个请求都可用的系统变量。
  • -f 是一个内置条件,用于验证请求的名称是否存在于磁盘上并且是一个文件。! 是一个否定运算符。组合起来,!-f 仅在指定的名称不存在或不是文件时评估为真。
  • 类似地,!-d 仅在指定的名称不存在或不是目录时评估为真。

最后一行上的 RewriteRule 仅对不存在的文件或目录的请求生效。RewriteRule 本身非常简单,将每个请求重定向到 / 网站根目录。

结论

mod_rewrite 是一个有用的 Apache 模块,可以有效地用于确保人类可读的 URL。在本教程中,您学习了如何使用 RewriteRule 指令重定向 URL,包括带有查询字符串的 URL。您还学习了如何使用 RewriteCond 指令有条件地重定向 URL。

如果您想了解更多关于 mod_rewrite 的信息,请查看 Apache 的 mod_rewrite 介绍和 Apache 的官方 mod_rewrite 文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2221383.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL程序特别酷

这一篇和上一篇有重合的内容&#xff0c;&#xff0c;我决定从头开始再学一下MySQL&#xff0c;和上一篇的区别是写的更细了&#xff0c;以及写这篇的时候Linux已经学完了 下面就是关于MySQL很多程序的介绍&#xff1a; MySQL安装完成通常会包含如下程序&#xff1a; Linux系…

uniapp移动端优惠券! 附源码!!!!

本文为常见的移动端uniapp优惠券&#xff0c;共有6种优惠券样式&#xff08;参考了常见的优惠券&#xff09;&#xff0c;文本内容仅为示例&#xff0c;您可在此基础上调整为你想要的文本 预览效果 通过模拟数据&#xff0c;实现点击使用优惠券让其变为灰色的效果&#xff08;模…

鸿蒙网络编程系列32-基于拦截器的性能监控示例

1. 拦截器简介 在Web开发中拦截器是一种非常有用的模式&#xff0c;它允许开发者在请求发送到服务器之前或响应返回给客户端之前执行一些预处理或后处理操作。这种机制特别适用于需要对所有网络请求或响应进行统一处理的情况&#xff0c;比如添加全局错误处理、请求头的修改、…

Linux中输入和输出基本过程

目录 Linux中输入和输出基本过程 文件内核级缓冲区 何为重定向 子进程与缓冲区 手撕一个简单的shell&#xff08;版本2&#xff09; 判断重定向命令与截取 执行重定向 简单实现stdio.h中的文件相关操作 FILE结构体 fopen函数 fwrite函数 fflush函数 fclose函数 Li…

Vue+TypeScript+SpringBoot的WebSocket基础教学

成品图&#xff1a; 对WebSocket的理解&#xff08;在使用之前建议先了解Tcp&#xff0c;三次握手&#xff0c;四次挥手 &#xff09;&#xff1a; 首先页面与WebSocket建立连接、向WebSocket发送信息、后端WebSocket向所有连接上WebSoket的客户端发送当前信息。 推荐浏览网站…

燕山大学23级经济管理学院 10.18 C语言作业

燕山大学23级经济管理学院 10.18 C语言作业 文章目录 燕山大学23级经济管理学院 10.18 C语言作业1C语言的基本数据类型主要包括以下几种&#xff1a;为什么设计数据类型&#xff1f;数据类型与知识体系的对应使用数据类型时需要考虑的因素 21. 逻辑运算符2. 真值表3. 硬件实现4…

设计模式(UML图、类之间关系、设计原则)

目录 一.类的UML图 1.类的UML图 2.类之间的关系 2.1 继承关系&#xff1a; 2.2关联关系 2.2.1单项关联 2.2.2双向关联 2.2.3自关联 2.3聚合关系 2.4组合模式 2.5依赖关系 二、设计三原则 2.1单一职责原则 2.2开放封闭原则 2.3依赖倒转原则 一.类的UML图 1.类的…

考研篇——数据结构王道3.2.2_队列的顺序实现

目录 1.实现方式说明2.代码实现2.12.1.1 代码12.1.2 代码22.1.3 代码3 2.22.2.1 代码42.2.5 代码52.2.6 代码6 总结 1.实现方式说明 多在选择题中考察 队尾指针&#xff08;rear&#xff09;有两种指向方式&#xff1a; 队尾指针指向队尾元素的位置&#xff0c;队尾指针指向…

9个3D直播场景推荐

在科技日新月异的今天&#xff0c;3D直播技术正逐步渗透至文旅领域&#xff0c;为游客带来前所未有的沉浸式体验。以下是vLive虚拟直播九个精心推荐的文旅3D直播场景&#xff0c;它们不仅展现了各地独特的文化魅力&#xff0c;还通过高科技手段让游客仿佛穿越时空&#xff0c;身…

ArcGIS应用指南:多尺度渔网创建

在GIS中&#xff0c;创建渔网矢量文件是GIS中的一项常见任务&#xff0c;通过将研究区域划分为规则的网格&#xff0c;可以更精细地分析和管理城市空间数据。本文以厦门市行政区为例&#xff0c;详细介绍了如何创建不同尺度的渔网矢量网格&#xff0c;以适应不同区域的发展特点…

代码随想录算法训练营第46期Day35

leetcode.452.用最少数量的箭射爆气球 class Solution { public:static bool cmp(const vector<int>& a,const vector<int>& b){//对Xend进行排序return a[1]<b[1]; } //这个题比较好贪&#xff0c;我们每次射只需要射Xend就可以了&#xff0c;然后用此…

OpenCL内存模型

OpenCL将内存划分成主机内存和设备内存。主机内存可在主机上使用&#xff0c;其并不在OpenCL的定义范围内。使用对应的OpenCL API可以进行主机和设备的数据传输&#xff0c;或者通过共享虚拟内存接口进行内存共享。而设备内存&#xff0c;指定是能在执行内核中使用的内存空间。…

什么是不同类型的微服务测试?

大家好&#xff0c;我是锋哥。今天分享关于【什么是不同类型的微服务测试&#xff1f;】面试题&#xff1f;希望对大家有帮助&#xff1b; 什么是不同类型的微服务测试&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 微服务架构中的测试可以分为多种类…

【ROS2】构建导航工程

1、ROS小车组成 ROS小车由三大件组成:运动底盘、ROS主控、导航传感器。 1.1 运动底盘 运动底盘的硬件由车轮、电机(带编码器)、电机驱动器、STM32控制器、电池等组成。 涉及的知识点主要为:STM32单片机程序、机器人运动学分析 1)STM32单片机程序 单片机程序框架如下:…

在Linux命令行下载Google Drive大文件(解决Google Drive下载慢的问题)

文章目录 1、使用gdown命令2、复制链接3、替换为Linux下载链接 注意&#xff1a;在Linux命令行进行 1、使用gdown命令 wget只能下载小文件&#xff0c;大文件需要用到gdown pip install gdown# 如果不能够直接安装&#xff0c;使用以下命令 git clone https://github.com/wk…

基于Spring Boot + Vue程序员云书店系统设计与实现

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

MySQL9.0安装教程zip手动安装(Windows)

本章教程&#xff0c;主要介绍如何在Windows上安装MySQL9.0&#xff0c;通过zip方式进行手动安装。 一、下载MySQL压缩包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 二、解压MySQL压缩包 将下载好的压缩包&#xff0c;进行解压缩&#xff0c;并且将…

要让AI(任何一款绘图AI)把一个己有风格的图片画到一个实物商品上的窍门

本教程适合midjourney, comfyui, stable diffusion 己有图片 希望生成效果 我们希望&#xff0c;在一个现实世界真实IPhone手机上可以有一个这样的小魔女作为一个手机的展示&#xff0c;同时手机处于开机状态&#xff0c;在手机的屏幕上有一个这样的戴帽子的穿蓝色小披风的小…

阿里Dataworks使用循环节点和赋值节点完成对mongodb分表数据同步

背景 需求将MongoDB数据入仓MaxCompute 环境说明 MongoDB 100个Collections&#xff1a;orders_1、orders_2、…、orders_100 前期准备 1、MongoDB数据源配置 需要先保证DW和MongoDB网络是能够联通的&#xff0c;需要现在集成任务中配置MongoDB的数据源信息。 具体可以查…

Java项目-基于springboot框架的学习选课系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…