【问题标题】:HTACCESS: How to URL rewrite a sub-subdomain?HTACCESS:如何 URL 重写子域?
【发布时间】:2015-07-02 13:33:07
【问题描述】:

我有子域apps.domain.com 指向domain.com/apps

我想重写appName.apps.domain.com的URL,其中appName是指向domain.com/apps/appName的变量

  • 我正在寻找内部转发(浏览器的 URL 没有变化)

我的.htaccess 文件中应该有什么,应该保存在哪里?在/apps/ 文件夹中?还是在root 文件夹中?

最后,如果不能使用.htaccess 文件,我该怎么做?我正在使用 Linux godaddy 服务器作为主机。


**** 问题已于 2018 年 7 月 8 日更新;添加了更多详细信息 ****

  • 我正在使用 GoDaddy SHARED 托管
  • 目前托管多个域
  • 因此,目录结构为public_html/domain.com/,其中/domain.com/ 是托管域名的名称
  • 子子域专属于 1 个特定域

示例:

  • 如果域名是domain.com
  • 有多个名称,但举个例子。如果应用的名称是awesome
  • 如果 uri 是:awesome.apps.domain.com 将指向...public_html/domain.com/apps/awesome/
  • 如果 uri 是:ubertz.apps.domain.com 将指向...public_html/domain.com/apps/ubertz/
  • 等等……

【问题讨论】:

  • 请发布现有的.htaccess,假设这是路由apps.domain.comdomain.com/apps。 mod_rewrite 高度依赖于顺序,因此我们需要完整的上下文。
  • 我用godaddy的cpanel添加了一个子域。它不使用 htaccess 文件。现在我在任何地方都没有 htaccess 文件。
  • @Omar 他们的解决方案之一有效吗?

标签: .htaccess url-rewriting


【解决方案1】:

我正在使用此代码进行子域转发:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*)\.apps\.domain\.com$
RewriteRule (.*) /apps/%1/$1

解释:

  • RewriteCond 中,您使用正则表达式(.*) 捕获应用程序名称 - 它将被保存到变量%1
  • RewriteRule 中转发所有内容-这是另一个(.*) 表达式,其内容将保存在变量$1 中-到目录/apps/<appName>/<path after URL>

有关正则表达式的更多信息,我建议查看本教程:http://www.webforgers.net/mod-rewrite/mod-rewrite-syntax.php

您应该将.htaccess 保存在域的root 目录中,在您的情况下保存在public_html/domain.com/ 中。如果不起作用,请将其放在apps 文件夹中。

【讨论】:

  • 我更新了问题,因为我注意到它指向public_html/。对此感到抱歉。
  • @Omar 然后将其保存在public_html/domain.com/ 中。我还更新了我的答案并添加了有关转发的更多信息。
【解决方案2】:

创建通配符子子域

您需要做的第一件事是创建通配符*.apps.domain.com 子子域。

  1. (如果您使用域名服务器,请跳过此步骤!) 登录您的域名注册商,并为 *.apps 创建一个A 记录 .domain.com (是的,那是一个星号) 并将其指向服务器 IP 地址。请注意,DNS 最长可能需要 48 小时才能传播。

  2. 登录您的网络托管帐户,然后转到部分下的菜单“子域”。创建一个 子域 *.apps.domain.com,它指向 "/public_html/domain.com/apps" 文件夹作为它的 文档根目录。并等到传播结束。

访问How to create wildcard subdomain in cPanelHow to Create a Sub-Subdomain 了解更多信息。如果您的服务器配置不允许您创建通配符子子域,则只需创建 *.domain.com 并将其指向 "/public_html/domain.com/apps" em>。

重写通配符子子域

将这些指令放在通配符 *.apps.domain.com 的文档根目录的 .htaccess 文件中,在本例中为 "/public_html /domain.com/apps".

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.+)\.apps\.domain\.com
RewriteRule (.*) http://domain.com/apps/%1/$1 [QSA,P,L]

%1(.+) 的编号反向引用,$1(.*)。如果您从同一服务器中的特定域 http://domain.com/apps/%1/$1 重写 URL,则需要包含 [P] 标志,否则它将被重定向。如果您要使用重写的通配符子域的查询字符串,请使用 [QSA] 标志。访问P|proxyQSA|qsappend 了解更多信息。如果我忘记了某些内容,只需进行一些调整,除此之外,是服务器的错。

需要考虑的几件事

您必须为将存在的重复子域配置 .htaccess 文件,例如 otherwildcard.apps.domain.comanother。 wilcard.apps.domain.comother.deep.level.apps.domain.com 将复制 apps.domain.com都具有相同的文档根。配置为重定向或告诉客户端这些子域不存在。

【讨论】:

    【解决方案3】:

    试试这些 .htaccess 指令:

    RewriteEngine on
    RewriteCond %{REQUEST_URI} ^(.*)\.apps\.domain\.com$
    RewriteRule (.*) /apps/appName/$1 [P,L]
    

    由于 [P] 标志,RewriteRule 不会重定向用户。这会将请求重定向到处理请求并返回结果的mod_proxy 模块。

    更多信息请参见http://httpd.apache.org/docs/2.4/mod/mod_proxy.html

    【讨论】:

    • 我更新了问题,因为我注意到它指向public_html/。对此感到抱歉。
    • 如果apps.domain.com 已经指向public_html/domain.com/apps/ 如果你把它放在你的apps 文件夹中htaccess 应该可以工作。它将调用“domain.com/apps/myApp”作为 url,应该解析为 public_html/domain.com/apps/myApp
    猜你喜欢
    • 2011-05-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 1970-01-01
    • 2012-04-03
    • 1970-01-01
    相关资源
    最近更新 更多