我想在子文件夹中运行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创建一个重定向转到/
。)
答案 0 :(得分:1)
解决这个问题的最简单方法就是你所说的你不想做的事情。让gitlab在独角兽/gitlab/
的子目录中运行。这将使Gitlab第一次以正确的方式编写HTML链接,因此Apache在通过时不必修改任何内容。
您遇到的问题是让Apache重写实际的HTML,以便在URL通过时将/gitlab/
添加到URL。对于HTTP服务器来说,这不是一件容易的事。对于Apache,您可能需要查看mod_proxy_html
module来完成此任务。当然,这可能不是一个完美的解决方案。