本文档是mod_rewrite
参考文档的补充。它描述了可能有关的最重要概念之一,mod_rewrite
即何时避免使用它。
mod_rewrite
当发现其他替代方案不足时,应将其视为万不得已的方法。在存在更简单的替代方案时使用它会导致配置混乱,脆弱且难以维护。理解还有哪些其他选择是通向mod_rewrite
精通的非常重要的一步。
请注意,这些示例中的许多示例在您的特定服务器配置中都不会起作用,因此,理解它们,而不只是将示例剪切并粘贴到您的配置中,这一点很重要。
最mod_rewrite
正确的解决方案是最好的解决方案要求访问服务器配置文件,而您没有访问权。某些配置指令仅在服务器配置文件中可用。因此,如果您处于只能使用.htaccess文件进行托管的情况,则可能需要诉诸
mod_rewrite
。
mod_alias
提供Redirect
和RedirectMatch
指令,它们提供一种将一个URL重定向到另一个URL的方法。一种简单的将一个网址或一类网址重定向到其他地方的方式,应该使用这些指令而非来完成RewriteRule
。RedirectMatch
允许您在重定向条件中包含正则表达式,从而提供使用的许多好处RewriteRule
。
常见的用法RewriteRule
是重定向整个URL类。例如,/one
目录中的所有URL 必须重定向到http://one.example.com/
,或者也许所有http
请求都必须重定向到
https
。
Redirect
指令可以更好地处理这些情况。请记住,这会Redirect
保留路径信息。也就是说,对于一个URL重定向/one
也将重定向下,所有的URL,例如/one/two.html
和/one/three/four.html
。
要将URL重定向/one
到
http://one.example.com
,请执行以下操作:
Redirect "/one/" "http://one.example.com/"
为了一个主机重定向到另一个,例如
example.com
到www.example.com
,看到
典型主机名
配方。
要将http
URL 重定向到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
同一范围内还有其他指令,则使用来执行此任务可能是适当的。这是因为,当Redirect
和RewriteRule
指令在同一作用域中时RewriteRule
,无论配置文件在外观中的顺序如何,这些
指令将首先运行。
对于从http到https的重定向,
RewriteRule
如果您无权访问主服务器配置文件,则必须使用,而必须在.htaccess
文件中执行此任务。
该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
在许多常见方案中都可以替换
。