【问题标题】:mod_rewrite: Error whilst rewriting subdomain to directory via %{HTTP_HOST}mod_rewrite:通过 %{HTTP_HOST} 将子域重写到目录时出错
【发布时间】:2013-01-26 03:34:30
【问题描述】:

mod_rewrite 的问题

当谈到 Apache 的 mod_rewrite 时,我遇到的麻烦比我想象的要多。我已经发布了一个问题 问题,这已得到澄清,但我继续收到错误,我看不到任何逻辑错误 配置。任何帮助将不胜感激!

我使用的.htaccess如下:

# Begin Rewrite Module for http://*.example.com/
# ==============================================
<IfModule mod_rewrite.c>

    # Turn the rewrite engine on and set the base path.
    RewriteEngine On
    RewriteBase /

    # Map subdomains to their respective directories.
    RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
    RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]

</IfModule>

这不起作用,因为内部重定向太多,导致500 Internal Server Error - 这是它的调试日志:

[Fri Feb 15 16:49:30.318509 2013] [core:error] [pid 2316:tid 1708] [client 127.0.0.1:9141] AH00124: Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary. Use 'LogLevel debug' to get a backtrace.
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3502): [client 127.0.0.1:9141] AH00121: r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /public_subdomains/sub1/index.php
[Fri Feb 15 16:49:30.318509 2013] [core:debug] [pid 2316:tid 1708] core.c(3508): [client 127.0.0.1:9141] AH00122: redirected from r->uri = /

我找到了一种解决方案,通过将 [L] 标志替换为 RewriteRule 上的 [END] 标志,它完美地将请求 URI 映射到子域目录中的相应文件。

不幸的是,它运行得太完美了。对 subdomain.example.com/folder/ 的调用会在不考虑 DirectoryIndex 的情况下内部重写为 example.com/public_subdomains/subdomain/folder/,此时它应该重写为 example.com/public_subdomains/subdomain/folder/index.php(假设 index.php 设置为 DirectoryIndex)。

如果有人能帮助我阐明这一点,我将永远感激不尽!

【问题讨论】:

  • 我认为您将 URL 与系统路径混合在一起。这个http://example.com/index.php 和这个/public_html/index.php 指向同一个文件。在 .htaccess 文件中,PT 标志是隐含的,并且只能使用 URL。也许您的问题中还有其他问题,但这个问题非常明显。
  • 我已编辑问题以从示例重写列表中删除 /public_html,但不,不使用系统路径。所有路径都相对于文档根目录(这是我从之前的问题中解决的问题)。但是指出系统路径和 URL 之间的区别是值得称赞的 - 我花了几天时间试图理解这个问题!
  • 您是否尝试过至少 RewrteLogLevel 3 的 RewriteLog?这可以帮助您调试。我的事情,可能有问题:RewriteRule (.*) public_subdomains/%1/$1 [L] 但是 RewriteLog 告诉你更多。
  • 请说明您是否希望重定向 URI 为 http://example.com/public_subdomains/subdomain/folder/index.phphttp://subdomain.example.com/public_subdomains/subdomain/folder/index.php

标签: .htaccess mod-rewrite subdomain


【解决方案1】:

好吧,有一个逻辑错误。给大家参考一下docs的精彩控制流程图:

你看,内部重定向也是一个请求,所以它再次被所有重写规则处理。因此,假设用户请求 something.example.com/x: RewriteRule macthes,RewriteCond 已完成,因此进行了到 public_subdomains/something/x 的内部重定向。新的请求是到something.example.com/public_subdomains/something/x:RewriteRule 匹配,RewriteCond 已经完成......然后你就进入了无限循环。

[L] 标志仅停止处理当前请求:无论如何,该请求将在第二遍中处理。 [END] 标志确实停止了循环,但它是一个蛮力的事情,因为你已经注意到它有副作用,所以最好加入一个停止递归的条件。像这样的:

RewriteCond %{HTTP_HOST} ^([^\.]+)\.example\.com$ [NC]
RewriteCond %{REQUEST_URI} !^/public_subdomains/%1
RewriteRule ^(.*)$ public_subdomains/%1/$1 [L]

添加的 RewriteCond 将检查请求的 uri 是否已经以“public_subdomains/something”开头。

它未经测试,所以可能有问题,但这是基本思想。

【讨论】:

  • 我发现在重写规则之前添加RewriteRule ^public_subdomains - [L] 比添加另一个RewriteCond 更干净。
  • @mootinator 绝对是,这看起来更加地道和更好。
  • 虽然它没有提供解决方案(最终通过访问 DNS 记录解决了这个问题),但您的答案值得赏金 - 写得很好的解释,将来会帮助我,我敢肯定.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2012-05-25
  • 2016-09-24
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多