<-
Apache HTTP 服务器 2.4 > 何时不使用mod_rewrite

何时不使用mod_rewrite

本文档是mod_rewrite 参考文档的补充。它描述了可能有关的最重要概念之一,mod_rewrite即何时避免使用它。

mod_rewrite当发现其他替代方案不足时,应将其视为万不得已的方法。在存在更简单的替代方案时使用它会导致配置混乱,脆弱且难以维护。理解还有哪些其他选择是通向mod_rewrite精通的非常重要的一步。

请注意,这些示例中的许多示例在您的特定服务器配置中都不会起作用,因此,理解它们,而不只是将示例剪切并粘贴到您的配置中,这一点很重要。

mod_rewrite正确的解决方案是最好的解决方案要求访问服务器配置文件,而您没有访问权。某些配置指令仅在服务器配置文件中可用。因此,如果您处于只能使用.htaccess文件进行托管的情况,则可能需要诉诸 mod_rewrite

支持Apache!

也可以看看

最佳

简单重定向

mod_alias提供RedirectRedirectMatch指令,它们提供一种将一个URL重定向到另一个URL的方法。一种简单的将一个网址或一类网址重定向到其他地方的方式,应该使用这些指令而非来完成RewriteRuleRedirectMatch 允许您在重定向条件中包含正则表达式,从而提供使用的许多好处RewriteRule

常见的用法RewriteRule是重定向整个URL类。例如,/one目录中的所有URL 必须重定向到http://one.example.com/,或者也许所有http请求都必须重定向到 https

Redirect 指令可以更好地处理这些情况。请记住,这会Redirect保留路径信息。也就是说,对于一个URL重定向/one也将重定向下,所有的URL,例如/one/two.html/one/three/four.html

要将URL重定向/onehttp://one.example.com,请执行以下操作:

Redirect "/one/" "http://one.example.com/"

为了一个主机重定向到另一个,例如 example.comwww.example.com,看到 典型主机名 配方。

要将httpURL 重定向到https,请执行以下操作:

<VirtualHost *:80>
    ServerName www.example.com
    Redirect "/" "https://www.example.com/"
</VirtualHost>

<VirtualHost *:443>
    ServerName www.example.com
    # ... SSL configuration goes here
</VirtualHost>

RewriteRule如果RewriteRule同一范围内还有其他指令,则使用来执行此任务可能是适当的。这是因为,当RedirectRewriteRule指令在同一作用域中时RewriteRule,无论配置文件在外观中的顺序如何,这些 指令将首先运行。

对于从http到https的重定向, RewriteRule如果您无权访问主服务器配置文件,则必须使用,而必须在.htaccess文件中执行此任务。

最佳

URL别名

Alias指令规定,从一个URI映射到一个目录-通常是你的目录之外DocumentRoot。尽管出于简单性和性能的考虑,尽管可以使用进行映射mod_rewrite, 但这Alias是首选方法。

使用别名

Alias "/cats" "/var/www/virtualhosts/felines/htdocs"

mod_rewrite当您无权访问服务器配置文件时,可以 使用执行此映射。别名只能在服务器或虚拟主机上下文中使用,而不能在.htaccess文件中使用。

如果Options FollowSymLinks在服务器上启用了符号链接,则将是完成相同任务的另一种方法。

最佳

虚拟主机

尽管可以使用mod_rewrite处理虚拟主机,但这很少是正确的方法。创建单个 <VirtualHost>块几乎总是正确的方法。如果您有大量的虚拟主机,请考虑使用 mod_vhost_alias来自动创建这些主机。

诸如此类的模块mod_macro对于动态创建大量虚拟主机也很有用。

mod_rewrite如果您使用的托管服务不提供对服务器配置文件的访问权限,则使用vitualhost创建可能是合适的,因此,您只能使用.htaccess文件进行配置。

请参阅带有mod_rewrite虚拟主机 文档,以获取有关在看起来仍然正确的方法下如何完成此操作的更多详细信息。

最佳

简单代理

RewriteRule提供[P]标志以通过传递重写的URI mod_proxy

RewriteRule "^/?images(.*)" "http://imageserver.local/images$1" [P]

但是,在许多情况下,如上面的示例所示,当不需要实际的模式匹配时,该ProxyPass指令是更好的选择。这里的示例可以表示为:

ProxyPass "/images/" "http://imageserver.local/images/"

请注意,无论您使用RewriteRule还是ProxyPass,都仍然需要使用 ProxyPassReverse指令来捕获从后端服务器发出的重定向:

ProxyPassReverse "/images/" "http://imageserver.local/images/"

如果在同一作用域中RewriteRule还有其他有效RewriteRule的,您可能需要改用,因为a RewriteRule通常会在之前生效 ProxyPass,因此可能会抢占您要完成的工作。

最佳

环境变量测试

mod_rewrite通常用于根据特定环境变量或请求标头的存在或不存在采取特定操作。使用可以更有效地完成此操作 <If>

例如,请考虑RewriteRule用于强制规范主机名的常见方案 ,例如www.example.com代替 example.com。可以使用<If>指令完成此操作,如下所示:

<If "req('Host') != 'www.example.com'">
    Redirect "/" "http://www.example.com/"
</If>

该技术可用于基于任何请求标头,响应标头或环境变量来执行操作,mod_rewrite在许多常见方案中都可以替换 。

请参阅表达式评估文档,以获取有关在<If>各节以及某些其他指令中可以使用的表达式类型的概述。

可用语言: zh  |  fr 

最佳

注释

注意:
这不是“问答”部分。此处放置的评论应指向有关改进文档或服务器的建议,如果实施或被认为无效/偏离主题,我们的主持人可以将其删除。有关如何管理Apache HTTP Server的问题,应直接指向我们的IRC频道#httpd(位于Freenode上),或发送至我们的邮件列表
目前,此页面已禁用评论。