2

我在网络世界里有点菜鸟,所以我很抱歉......我尝试了很多在 SO 和其他地方找到的东西,但我没有设法做我想做的事。而且 Apache 文档……太完整了。

基本上我想要做的是将我的域重定向到一个子文件夹。我为此找到了简单的解决方案(实际上有很多不同)。

http://www.foo.com/
http://foo.com/

应该重定向到/bar并显示为http://foo.com/

使用以下我得到了预期的结果:

RewriteEngine on
Options +FollowSymLinks
RewriteCond %{HTTP_HOST} ^www\.foo.com$
RewriteRule ^/?$ "http\:\/\/foo.com" [R=301,L]
RewriteRule ^((?!bar/).*)$ bar/$1 [NC,L]

但我也希望子文件夹和文件名在明确输入时不出现,即:

http://www.foo.com/index.html
http://foo.com/index.html
http://wwww.foo.com/bar
http://foo.com/bar
http://wwww.foo.com/bar/index.html
http://foo.com/bar/index.html

应该都显示为

http://foo.com/

这可能吗 ?

显然使用.htaccess,因为我在虚拟主机上。

谢谢

4

1 回答 1

0

正如 Felipe 所说,这实际上是不可能的,因为当您执行 R=301 重定向时,您会丢失信息:像这样的硬重定向会启动一个全新的请求,而不会记住先前的请求。

当然,有很多方法可以做类似的事情。最简单的方法是将原始请求放在查询字符串中(这里是关于 mod_rewrite 如何处理查询字符串的一个很好的概要)。当然,查询字符串确实会显示在 URL 中,但大多数现代浏览器会将查询字符串隐藏在地址栏中,因此如果您的目标是美学,那么这种方法是可行的。

如果您真的不想在 URL 中显示任何原始查询,则可以通过使用CO 标志来使用 cookie (这里有一些关于 cookie 操作的非常好的示例)。无论如何,关于原始请求的信息必须以某种方式在硬重定向中传递。

但无论如何,最重要的是,你为什么要做这样的事情?它一定会混淆人类和机器人。当框架流行时,很多页面的行为都是这样的,而且非常糟糕(没有书签,没有简单的内容链接,谷歌结果带有“您的浏览器无法处理框架”的片段,没有重新加载,不稳定的后退按钮,哦,男孩,那些日子)。

说到这里,如果你的内容是 html,你可以只使用一个普通的旧 iframe 来实现效果(但我真诚地建议不要这样做)。

于 2012-12-16T23:19:44.860 回答