【问题标题】:Apache mod_rewrite redirect subdomains on specific basisApache mod_rewrite 在特定基础上重定向子域
【发布时间】:2019-11-19 10:29:21
【问题描述】:

我正在开发一个在我的域上运行的应用程序。 一切都按预期工作,但我似乎无法找到与子域相关的问题的任何好的答案。

此应用程序允许不同的客户端注册自己并在应用程序中获得自己的“环境”。

例如如果client1注册了自己,他的环境将在https://main.application.com/v/client1

现在,如您所见,这很丑陋。我希望他能够转到https://client1.application.com/,并在后台显示https://main.application.com/v/client1。 我读过这可以通过 apache rewrite 实现。

我猜我的情况比简单的重写要复杂一些。我想要实现的是:

User goes to | Has to redirect to

client1.application.com | main.application.com/v/client1

client1.application.com/register | main.application.com/v/client1/register

client1.application.com/dashboard | main.application.com/dashboard

client1.application.com/... | main.application.com/...

如您所见,唯一一次我想使用附加到我的域的 /v/client1 进行重定向,是当有人尝试注册或尝试访问其环境的登录页面时。在所有其他情况下,我只想获取 URL 后面的内容并将其附加到 main.application.com(这是主应用程序运行的地方)。我也不希望用户注意到重定向,但地址栏中的 URL 保持不变。

我试图想出一些伪代码来解释我想要做什么:

If subdomain.application.com/ or subdomain.application.com/register
--> take subdomain and paste it like this: 
main.application.com/v/SUBDOMAIN/ or main.application.com/v/SUBDOMAIN/register
Else
--> Redirect to main.application.com/URL
    e.g. client1.application.com/dashboard --> main.application.com/dashboard

但是我完全不知道应该如何用 Rewrite 来编写它。

有没有人在这方面有经验可以帮助我进行这些重写?我是新手,我找不到我的具体案例的文档。

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    假设对这些主机名(“子域”)的所有请求都由同一个 http 主机处理(通过 ServerAlias 或简单地使用默认后备主机),这应该很简单......

    1. 将任何请求直接重写为example.comwww.example.com
    2. 将请求重写到指定任何路径的其他主机
    3. 向指定/register路径的其他主机重写请求
    4. 不需要处理其他路径如果您的 http 主机对所有这些主机(“子域”)使用相同的文件系统布局 (DOCUMENT_ROOT)

    剩下的就是这个:

    RewriteEngine on
    RewriteCond %{HTTP_HOST} ^example\.com$ [OR]
    RewriteCond %{HTTP_HOST} ^www\.example\.com$
    RewriteRule ^ - [END]
    
    RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$
    RewriteRule ^/?$ /v/%1 [END]
    
    RewriteCond %{HTTP_HOST} ^([^.]+)\.example\.com$
    RewriteRule ^/?register/?$ /v/%1/register [END]
    

    如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的[END] 标志的明确提示。您可以尝试升级或使用较旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

    此实现同样适用于 http 服务器主机配置或动态配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用动态配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

    一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用动态配置文件(“.htaccess”)。这些动态配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

    【讨论】:

    • 谢谢!我会尽快实施和测试。感谢您的努力。
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    相关资源
    最近更新 更多