【问题标题】:.htaccess redirect to subfolder, and remove it's name.htaccess 重定向到子文件夹,并删除它的名字
【发布时间】:2012-12-03 20:29:52
【问题描述】:

我是网络世界的菜鸟,所以我很抱歉......我尝试了很多在 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,因为我在虚拟主机上。

谢谢

【问题讨论】:

  • 在第一个重定向规则中,URI(例如/bar/index.html)被删除,所以没有任何东西可以附加到最后一个重写规则。我认为不可能按照您的要求将其概括。如果它适用于 /bar 是因为您在规则中明确添加了它。

标签: .htaccess mod-rewrite redirect hide subdirectory


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 2018-02-24
    • 2019-03-05
    • 2013-01-20
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多