在Apache 2.4.7上设置通配符子域反向代理

现在运行一个项目,需要为特定页面提供所有匹配的子域名。 这必须作为(反向?)代理,而不是作为redirect。

概观

几个(几十个甚至几十万个)用户将为他们设置一个URL,如下所示:

(some_user_name).example.tld 

例如: john_smith_123.example.tld

环境

  • Ubuntu 14.04 Apache 2.4.7
  • HTML / CSS / JS
  • 没有服务器端脚本(允许)

要求

  1. 访问(some_user_name).example.tld ,所有用户都必须看到位于example.tld/directory/sub-directory/的相同内容(具有parsing子域值的代码的Web表单)。 在该path的子目录中,我们有一个index.html (应该默认提供)和一个thank-you.html文件, thank-you.html文件应该在提交表单(确认页面)时提供。
  2. 在index.html页面上,我们有js代码来parsing出子域的值,并做魔术来显示为用户个性化的一些内容。 只要子地址存在于地址栏中,它就会工作。
  3. 我们也有一些js必须能够通过引用位于根域的资源(例如example.tld/assets/js/main.js )来加载资源。
  4. 在表单提交后,我们希望在地址栏(some_user_name).example.tld/thank-you中显示用户这个地址,它显示来自example.tld/directory/sub-directory/thank-you.html

所以,这是对的:

  • 用户转到(some_user_name).example.tld – >用户可以看到来自example.tld/directory/sub-directory/index.html页面内容,而地址栏仍然显示(some_user_name).example.tld
  • 然后用户提交表单(推测),并看到(some_user_name).example.tld/thank-you

这是错误的:

  • (some_user_name).example.tld – >redirect到example.tld / directory / sub-directory / index.html(显示在地址栏中)。

解决scheme?

我们一直在挖掘和尝试的答案(包括search和尝试几个堆栈溢出的答案),但相当符合要求,我们处于僵局。

以下是我们尝试的一些解决scheme:

  • https://stackoverflow.com/questions/1187289/setting-up-wildcard-subdomain-with-reverse-proxy-on-apache-2-2-3
  • 如何在Apache2的VirtualDocumentRoot中configuration和组合通配符域和子域?
  • 其他几个(外部堆栈溢出)像Apache文档和其他网站。

到目前为止,我们遇到了一些在文档化解决scheme(以及我们自己的尝试)中似乎很常见的问题。 我们尝试了几个(实际上,几个实现的2-3个不同的变体)。

所以,为了保持这一点,这里是最后两次尝试:

这里是最接近的我们来了:

 <VirtualHost *:80> ServerName example.com DocumentRoot /var/www/example.com DirectoryIndex index.html ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> RewriteEngine On </VirtualHost> <VirtualHost *:80> ServerName mailfunnel.example.com ServerAlias *.example.com example.com DocumentRoot /var/www/example.com/direct-mail/personal-debt-settlement/ DirectoryIndex index.html ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> RewriteEngine On </VirtualHost> 

这显示了正确的html内容,但是所有js / css都被破坏了(因为这些被编码为相对链接,例如/assets/js/main.js )。

我们不想使用绝对URL,因为这个页面内容可能在dev和uat环境(以及产品)上提供。

此外,虽然我们可以复制该资产文件夹,但我们不希望在两个地方复制和维护代码。

以下是我们之前尝试的非工作设置:

 <VirtualHost *:80> ServerName example.com ServerAlias *.example.com DocumentRoot /var/www/example.com DirectoryIndex index.html ProxyRequests Off <Proxy *> Order deny,allow Allow from all </Proxy> RewriteEngine On RewriteCond %{HTTP_HOST}/%{REQUEST_URI} ^(.*)\.example\.com/(.*)$ RewriteRule (.*) "http://example.com/directory/sub-directory/" [P] </VirtualHost> 

但是, (any_subdomain).example.tld返回一个404页面。

更改

 RewriteRule (.*) "http://example.com/directory/sub-directory/" [P] 

 RewriteRule (.*) "http://example.com/directory/sub-directory/index.html" [P] 

会导致redirect到http://example.com/directory/sub-directory/index (显示地址栏中的结果完整path),并显示“未find – 请求的URL /目录/子目录/索引不是在服务器上发现“错误。

index.html删除.html导致与之前相同的404页面。


思考?