Warm tip: This article is reproduced from serverfault.com, please click

apache-参考:mod_rewrite,URL重写和“漂亮链接”说明

(apache - Reference: mod_rewrite, URL rewriting and "pretty links" explained)

发布于 2013-12-13 10:07:37

“漂亮的链接”是一个经常要求的主题,但是很少对其进行完全解释。mod_rewrite是创建“漂亮链接”的一种方法,但是它很复杂,语法非常简洁,难以理解,并且文档假定HTTP具备一定水平的熟练程度。有人可以简单地解释“漂亮链接”如何工作以及如何使用mod_rewrite创建它们吗?

其他通用名称,别名,干净URL的术语:RESTful URL,用户友好的URL,SEO友好的URL,慢速运行和MVC URL(可能是用词不当)

Questioner
Viewed
11
2018-05-16 00:03:30

要了解什么是mod_rewrite,首先需要了解Web服务器的工作方式。Web服务器响应HTTP请求最基本的HTTP请求如下所示:

GET /foo/bar.html HTTP/1.1

这是浏览器对Web服务器的简单请求,Web服务器请求URL /foo/bar.html需要强调的是,它不请求文件,而仅请求任意URL。该请求也可能看起来像这样:

GET /foo/bar?baz=42 HTTP/1.1

这与对URL的请求一样有效,而且显然与文件无关。

Web服务器是在端口上侦听,接受该端口上传入的HTTP请求并返回响应的应用程序。Web服务器完全自由地以其认为合适的任何方式/以你配置为响应的任何方式来响应任何请求。该响应不是文件,它是HTTP响应,它与任何磁盘上的物理文件都可能有关系,也可能没有关系。Web服务器不必是Apache,还有许多其他Web服务器都只是永久运行的程序,并附加到响应HTTP请求的端口上。你可以自己写一个。本段的目的是使你脱离URL直接等于文件的任何观念,这一点非常重要。:)

大多数Web服务器的默认配置是在硬盘上查找与URL匹配的文件。如果服务器文档根目录设置为,/var/www则它可能会查看文件是否/var/www/foo/bar.html存在并提供文件如果文件以“ .php”结尾,它将调用PHP解释器,然后返回结果。所有这些关联都是完全可配置的。文件不必以“ .php”结尾,Web服务器就可以通过PHP解释器运行该文件,并且URL不必与磁盘上的任何特定文件匹配就可以进行操作。

mod_rewrite是一种重写内部请求处理的方法。当Web服务器收到对该URL的请求时/foo/bar,你可以将该URL重写为其他内容,然后Web服务器将在磁盘上查找与之匹配的文件。简单的例子:

RewriteEngine On
RewriteRule   /foo/bar /foo/baz

该规则表示,每当请求匹配“ / foo / bar”时,都将其重写为“ / foo / baz”。然后将像处理请求一样处理该请求/foo/baz这可以用于各种效果,例如:

RewriteRule (.*) $1.html

此规则匹配任何内容(.*)并捕获它((..)),然后将其重写以附加“ .html”。换句话说,如果/foo/bar是所请求的URL,则将其视为/foo/bar.html已被请求。有关正则表达式匹配,捕获和替换的更多信息,请参见http://regular-expressions.info

另一个经常遇到的规则是:

RewriteRule (.*) index.php?url=$1

再次匹配任何内容,并将其重写到文件index.php中,并在url查询参数中附加最初请求的URL 也就是说,对于所有传入的所有请求,都将执行文件index.php,并且该文件将可以访问中的原始请求$_GET['url'],因此它可以使用它执行任何所需的操作。

首先,你将这些重写规则放入Web服务器配置文件中Apache还允许你将它们放入.htaccess文档根目录下的一个文件中(即.php文件旁边)。

*如果主要的Apache配置文件允许;它是可选的,但通常会启用。

mod_rewrite不能做什么

mod_rewrite不能神奇地使你的所有URL都“漂亮”。这是一个普遍的误解。如果你的网站中有此链接:

<a href="/my/ugly/link.php?is=not&amp;very=pretty">

mod_rewrite无法做任何使它漂亮的事情。为了使它成为一个漂亮的链接,你必须:

  1. 将链接更改为漂亮的链接:

    <a href="/my/pretty/link">
    
  2. 使用/my/pretty/link上述任何一种方法,在服务器上使用mod_rewrite处理对URL的请求

(一个人可以mod_substitute结合使用来转换传出的HTML页面及其包含的链接。尽管这通常比更新HTML资源还要付出更多的努力。)

mod_rewrite可以做很多事情,你可以创建非常复杂的匹配规则,包括链接多个重写,将请求代理到完全不同的服务或机器,返回特定的HTTP状态代码作为响应,重定向请求等。它非常强大,可用于如果你了解基本的HTTP请求-响应机制,那就太好了。它并不会自动让你的链接漂亮。

有关所有可能的标志和选项,请参见官方文档