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

标签 apache .htaccess mod-rewrite friendly-url

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

其他通用名称,别名,干净URL的术语:RESTful URL,用户友好的URL,SEO友好的URL,slugging和MVC URL(可能是错误的名称)

最佳答案

要了解什么是mod_rewrite,首先需要了解Web服务器的工作方式。 Web服务器响应HTTP requests。最基本的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还允许*将它们放入文档根目录(即.php文件旁边)中名为.htaccess的文件中。

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

mod_rewrite不做什么

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

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


mod_rewrite不能使它变得漂亮。为了使它成为一个漂亮的链接,您必须:


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

<a href="/my/pretty/link">

使用上述任何一种方法,在服务器上使用mod_rewrite处理对URL /my/pretty/link的请求。


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

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

有关所有可能的标志和选项,请参见official documentation

关于apache - 引用:mod_rewrite,URL重写和“漂亮链接”说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45144834/

相关文章:

.htaccess - 如何使用 htaccess 在 url 中使用最后一个可选的尾随斜杠删除 txt 扩展名的需要

.htaccess - htaccess 重写多个文件夹

apache - centos 7上Nginx反向代理apache,同时配置http和https

Apache - 文件不存在错误(文件肯定存在) - favicon.ico

php - 证书存储可以放在 application.ini 而不是 php.ini 中吗

php - 如何通过htaccess删除index.php [高级]

apache - RewriteCond 比较 Apache htaccess 中的两个变量

regex - htaccess强制使用https并将www重定向到非www,但没有其他子域

apache - 禁止 https 访问整个网站,但只为一个 url 启用它

Apache/OpenVPN 访问限制