• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 何时不要使用 mod_rewrite

    它描述了可能有关的最重要概念之一,mod_rewrite即何时避免使用它。

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

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

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

    简单重定向

    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_rewriteAlias可以使用,但首选使用来执行此映射。

    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/"
    

    RewriteRuleRewriteRule在同一作用域中还有其他有效的s 时,您可能需要改用,因为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>各节以及某些其他指令中可以使用的表达式类型的概述。