【问题标题】:htaccess "faking subdomains"htaccess“伪造子域”
【发布时间】:2012-03-03 17:52:24
【问题描述】:

我一直在研究 htaccess 以及如何使用重写规则来为用户制作一种“假子域”。

到目前为止我有:

RewriteEngine On
RewriteBase /

RewriteCond %{HTTP_HOST} ^(www\.)?domain\.com
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ([a-z0-9-]+)/? http://$1.domain.com [R=301,NC,L]

RewriteCond %{HTTP_HOST} ^([a-z]+)\.domain\.com$
RewriteRule ^$ index.php?user=%1

这将获取任何 /somthing 并将其设为子域,然后将子域值作为参数传递给以获取。

我希望现在能够使用实际参数,并使用“子域”中的额外“用户”参数正常传递它们 例如

fred.domain.com/index.php?page=1&sort=up

会给我 $_GET

['user'] = 'fred'
['page']= 1
['sort'] = up

但对于我的生活,我无法弄清楚如何做到这一点!当我添加任何其他参数时,我会丢失用户位

有什么帮助吗? =)

此外,任何有关 htaccess 的有用教程都会很好!因为我发现的所有人都没有真正解释每个位的作用以及为什么=\

提前致谢

【问题讨论】:

  • 您可以为此使用环境变量。请参阅 apache 文档了解 mod_rewrite 如何设置或引用它们。此外,您可以在 PHP 脚本和 $_SERVER superglobal 中执行此操作。

标签: php .htaccess


【解决方案1】:

我很确定您可以将 vhost *.yourdomain.com 设置为指向单个路径,然后使用 mod_rewrite 进行 url 解析。

【讨论】:

    【解决方案2】:

    我假设:

    • 您拥有一个域,例如 domain.com,由某个共享托管服务 (SHS) 提供商托管。
    • 您可以访问控制面板来设置子域,或者您的 SHS 提供商已经设置了一个 * 映射到其共享服务的记录。
    • 一些 SHS 提供者只是将*.domain.com 映射到一个固定的子目录,比如/webroot/domain.com/public_html;其他人为他们的用户执行此顶级重定向,并提供一个控制面板,允许帐户持有人将子域与特定子目录相关联。

    因此,您需要确定适用于您的情况:

    • 查看您的 SHS 提供商常见问题解答,
    • 通过尝试http://sss.domain.com/ 来查看它是否路由到您的 DOCROOT
    • 通过使用phpinfo() 脚本来查看它使用什么Rewrite 环境变量来指向您的DOCROOT。 (由于 Apache 中的技术原因,请参阅Dynamic mass virtual hosts with mod_rewrite,%{DOCUMENT_ROOT} 无法为每个用户正确初始化,因此提供者通常使用 RewriteMap 来初始化替代;我使用 %{ENV:DOCUMENT_ROOT_REAL})李>

    假设您想在http://blog.domain.com/ 上建立一个博客,您可能需要:

    • 发出永久重定向 [R=301] 从旧版引用到 http://domain.com/blog/*http://blog.domain.com/*
    • 问题内部http://blog.domain.com/*重定向到DOCROOT/blogdir/*
    • 添加必要的条件联锁以防止无限重定向循环,然后将第二个内部重定向视为旧版引用。

    我可以给你一套重写规则来做到这一点,但鉴于我这个月已经回答了十几个相同的问题,你可以通过搜索或查看我的博客找到很多模板 (@987654322 @, .htaccess) 在那里我写了很多文章给出了更多的解释。

    如果您希望单个应用程序捕获某个域的通配符子集,只要您可以在正则表达式中对其进行编码,那么您可以执行以下操作:

    RewriteCond %{HTTP_HOST}    (sompattern)\.domain\.com
    RewriteRule ^(?!appdir/).*  appdir/catchall.php?arg=$0&subdomain=%1 [L,QSA]
    

    (?!appdir/) 位称为先行否定断言,这会阻止规则自行重新触发。

    【讨论】:

      【解决方案3】:

      .htaccess 文件与这里无关。它帮不了你。
      要将用户定向到您的服务器,您必须更改 DNS 记录,而不是 Web 服务器配置。

      【讨论】:

      • 不完全。大多数由托管服务运营的域都提供通配符子域路由。所以我的 DNS 域有一个子域,它指向我的托管服务 (HS) 负载平衡 IP,94.136.40.100,与所有其他共享托管帐户持有人一样。我的 HS 解码 HTTP_HOST 以将所有子域指向我的 DOCRROT,我必须使用我的 DOCROOT .htaccess 来处理子域。请参阅blog.ellisons.org.uk/search-Webfusion 以获得更多解释的文章。
      • 我在您的评论中没有看到与我的回答相矛盾的内容,但无论如何感谢您的努力。
      • 如果您的 HS 提供商已经设置了通配符 DNS 条目(大多数情况下),那么您在 DNS 中就无事all 的配置是在您的 DOCROOT .htaccess 中完成的,这至少会使您的两种陈述都具有误导性:(
      • 我还是不明白。如果您已经设置了 DNS,这并不意味着您根本不需要它。这里有什么误导?
      • 由于大多数 SHS 提供商为每个帐户设置了 * DNS A 记录,“您通常没有更改任何 DNS 记录。”实现OP想要的第一步是配置他或她的.htaccess文件。所以你的两个观点都差不多 180%,仅此而已。没什么大问题。对不起。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2014-07-25
      • 1970-01-01
      相关资源
      最近更新 更多