“漂亮的链接”是一个经常要求的主题,但是很少对其进行充分解释。 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&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/