通过特定的httpd服务器时,将子文件夹添加到URL

时间:2014-07-22 14:48:23

标签: apache mod-rewrite url-rewriting gitlab

我想在子文件夹中运行rails webapp(GitLab),例如http://localhost/gitlab,我想使用Apache httpd来执行此操作。 GitLab的一些apache conf可用here,当我在简单的上下文中使用它们时,它们运行良好。

但是现在我尝试将这个conf包含在更复杂的Apache conf中。我有以下Apache HTTPD配置:

前主要http服务器

ServerName localhost
Listen 80
...
(lot of rules)
...
ProxyPreserveHost On
ProxyPass /gitlab http://127.0.0.1:8888/
ProxyPassReverse /gitlab http://127.0.0.1:8888/

第二台服务器,其中我为Gitlab提供了apache conf,我尝试重写URL以在网址中添加/gitlab/

Listen 8888
...
RewriteCond %{REQUEST_URI} !^/gitlab/
RewriteRule ^(.*)$ /gitlab/$1
....
<VirtualHost *:8888>
  ServerName gitlab
  ServerSignature Off
  ProxyPreserveHost On

  <Location />
    Order deny,allow
    Allow from all
    ProxyPassReverse http://127.0.0.1:3000/
  </Location>

  RewriteEngine on
  RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
  RewriteRule .* http://127.0.0.1:3000%{REQUEST_URI} [P,QSA]

  DocumentRoot /opt/gitlab/.../public

</VirtualHost>

最后,我在unicorn运行了GitLab的127.0.0.1:3000 http服务器。


问题: 使用浏览器时,我转到localhost:80/gitlab它可以工作:我可以访问GitLab主页。但是,此页面上的所有HTML链接都会将我引导至localhost:80/somewhere,而不是localhost:80/gitlab/somewhere

所以这是我的问题:我怎样才能(在我的第二个httpd实例中运行8888强制在每个查询传递的URL中添加/gitlab/虽然这台服务器?我在conf中尝试了一些RewriteRule,但他们没有更改任何网址。

(另外,由于某些原因,我不想使用Rails config relative_url_root: /gitlab参数来实现这一点:它不会使GitLab在子目录中运行,它只是从{{1创建一个重定向转到/。)

1 个答案:

答案 0 :(得分:1)

解决这个问题的最简单方法就是你所说的你不想做的事情。让gitlab在独角兽/gitlab/的子目录中运行。这将使Gitlab第一次以正确的方式编写HTML链接,因此Apache在通过时不必修改任何内容。

您遇到的问题是让Apache重写实际的HTML,以便在URL通过时将/gitlab/添加到URL。对于HTTP服务器来说,这不是一件容易的事。对于Apache,您可能需要查看mod_proxy_html module来完成此任务。当然,这可能不是一个完美的解决方案。