htaccess将一个目录映射到另一个级别

时间:2014-06-23 13:57:56

标签: apache .htaccess mod-rewrite reverse-proxy mod-proxy

所以这就是我想要完成的事情。我有这个链接:

https://www.mydomain.com/foo/bar/

现在,目录" foo"实际上有一个网站在其中运行。为了组织起见,我不得不创建另一个这样的网站:

https://www.mydomain.com/fubar/

所以实际上链接https://www.mydomain.com/foo/bar/实际上并不是一个包含任何内容的目录。我更愿意发生的事情是当人们去https://www.mydomain.com/foo/bar/时,地址栏中的地址没有变化,而是在后端软件实际启动并使用https://www.mydomain.com/fubar/

示例:

当有人前往https://www.mydomain.com/foo/bar/sign_up.php时,他们仍然会在地址栏中看到这一点,但他们实际获得的是https://www.mydomain.com/fubar/sign_up.php

到目前为止,我所尝试的无济于事:

htaccess https://www.mydomain.com/foo/

Options +FollowSymlinks 
RewriteEngine on 
RewriteBase / 
RewriteRule ^bar/(.*) ../fubar/$1 [NC,L]

另外

RewriteCond %{PATH_INFO} ^bar/(.*)$ RewriteRule ^.*$ ../fubar/%1 [L]

htaccess https://www.mydomain.com/

RewriteRule ^foo/bar/(.*) /fubar/$1 [L]

更新:目录https://www.mydomain.com/foo/实际上是https://www.anotherdomain.com/的根目录。因此https://www.anotherdomain.com/bar应该提出https://www.mydomain.com/fubar/

1 个答案:

答案 0 :(得分:3)

你不能做像重写规则那样有../父目录引用的东西:

Options +FollowSymlinks 
RewriteEngine on 
RewriteBase / 
RewriteRule ^bar/(.*) ../fubar/$1 [NC,L]

您需要做的是在.htaccess的网站根目录https://www.mydomain.com/中设置类似内容:

Options +FollowSymlinks 
RewriteEngine on 
RewriteBase / 
RewriteRule ^foo/bar/?(.*)$ fubar/$1 [QSA,NC,L]

最后一行基本上抓取了路径中foo/bar的任何网址,/?使得尾部斜杠可选,(.*)$捕获作为参数传递的值。

现在,我的addition of QSA (Query String Append)对重写规则标志不是100%肯定,但想法是在您使用时查询字符串值完全传递到目标。我认为你需要它,但如果你不只是使用它:

Options +FollowSymlinks 
RewriteEngine on 
RewriteBase / 
RewriteRule ^foo/bar/?(.*)$ fubar/$1 [NC,L]

此外,有一种很好的方法来调试这样的规则,而无需一直重新加载浏览器,这可能是一个令人头痛的问题。在缓存内容时导致问题。这就是临时添加R(重写)标志&在调试时使用curl -I直接查看响应头。

例如,在我的本地MAMP(Mac OS X LAMP)设置中,当我将curl -I运行到http://localhost:8888/foo/bar/并设置了R标志时,我看到了这一点:

curl -I http://localhost:8888/foo/bar/

HTTP/1.1 302 Found
Date: Mon, 23 Jun 2014 14:11:11 GMT
Server: Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/0.9.8y DAV/2 PHP/5.4.10
Location: http://localhost:8888/fubar/
Content-Type: text/html; charset=iso-8859-1

在使用Location标记时,您可以看到Location: http://localhost:8888/fubar/R的更改。这是你想要的。然后,当您完成调整规则后,只需删除R标记&你应该好好去。

编辑:由于原始海报在更新问题时说明了所需的行为,因此重写规则永远不会有效:

  

目录https://www.mydomain.com/foo/实际上是根目录   https://www.anotherdomain.com/的目录。所以   https://www.anotherdomain.com/bar应该提出来   https://www.mydomain.com/fubar/

对于这样的情况,mod_rewrite是错误的工具。请改用mod_proxy。首先在Apache中启用它;示例假设您使用的是Ubuntu 12.04,但应该适用于大多数Linux Apache安装

sudo a2enmod proxy proxy_http

然后将其设置为从https://www.anotherdomain.com/bar/的路径https://www.mydomain.com/fubar/启用反向代理:

<IfModule mod_proxy.c>

  # Proxy specific settings
  ProxyRequests Off
  ProxyPreserveHost On

  <Proxy *>
    AddDefaultCharset off
    Order deny,allow
    Allow from all
  </Proxy>

  ProxyPass /bar/ https://www.mydomain.com/fubar/
  ProxyPassReverse /bar/ https://www.mydomain.com/fubar/

</IfModule>