【问题标题】:htaccess internal rewrite based on %{HTTP_HOST}htaccess 基于 %{HTTP_HOST} 的内部重写
【发布时间】:2014-10-17 19:29:18
【问题描述】:

目标是当主机名是子域(*.domain.de,如 www.domain.de、a.domain.de)时,内部将 所有 请求重写到服务器上某处的文档

非工作(状态 500).htaccess 条件/规则如下:

RewriteCond %{HTTP_HOST} ^(.*).domain\.de$ [NC]
RewriteRule ^(.*)$ /info\.html [L]

也许这是一个无限循环问题,因为请求“info.html”可能会再次检查 htaccess 规则? (甚至内部重写?)

【问题讨论】:

    标签: regex apache .htaccess mod-rewrite rewrite


    【解决方案1】:

    问题是一旦你重写到/info.html,你需要停止进一步的重写,否则500 Internal server) 将由于无限循环而导致。

    你的规则是这样的:

    RewriteCond %{HTTP_HOST} ^([^.]+)\.domain\.de$ [NC]
    RewriteRule !^info\.html$ /info.html [L]
    

    否定条件!^info\.html$在写入一次后将停止进一步重写。

    【讨论】:

    • 这很好用,已经发布了这个想法,也许无限循环可能会导致这个问题,但我无法处理和解决它。但是,还有两个问题: * 为什么要更改domain\.de 前面第一行(条件)中的模式? * 什么时候不需要在第二行(规则)的 info.html 前面写斜线?仅在后者中。
    • 在正则表达式中,点表示任何字符,因此它需要转义,因为\.! 用于RewriteRule 中的否定,这意味着如果URI 还不是/info.html,则执行。跨度>
    • 对不起,但是你以某种方式改变了第一行包含domain.de的表达式通过添加^([^.]+)而改变,我想知道它的含义,因为我没有这样做大大地。至于第二行,我指的是斜杠,而不是仅用于第二个 info.html (/info.html) 的反斜杠,而不是第一行 (info.html)。
    • 您使用.*,这意味着匹配任何0个或更多字符,而我使用效率更高的[^.]+,这意味着匹配直到匹配一个点。同样在 .htaccess URI 模式中开始 第一个前导斜杠之后,因此它将匹配 info\.html$ 但不匹配 /info\.html$。在 RHS 上,尽管它可能以 / 开头
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 2011-04-22
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多