所以这就是我想要完成的事情。我有这个链接:
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/
答案 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>