2

我在刚刚部署到暂存环境的新项目中使用 HTML5 Boilerplate 构建脚本。脚本就像一个魅力;它有据可查,因此很容易配置以在我的应用程序中使用。

在阅读完文档后,我决定使用 Paul Irish 的基于 VCS 的部署方法来指向 /publish 目录,并在我的 .htaccess 文件中使用他的文档中的这段代码:

RewriteEngine On
RewriteCond $1 !^publish/
RewriteRule ^(.*)$ publish/$1 [L]

我已经为我的特定设置进行了这样的配置,并且所有内容都指向缩小和连接的文件,就像它应该的那样。这很好,但也可以通过访问 http://[mysite.com]/publish/ 直接浏览 /publish 目录

这似乎有点像一根松散的线,让人悬空。我想知道这里是否有人遇到过这个问题并提出了一个好的解决方案。我不希望用户在 URL 之后输入 /publish/,但我不希望它肯定是可抓取的,而且这样离开它似乎有点草率。

有任何想法吗?

提前致谢

更新:在得到 Gerben 非常感谢的帮助之后,我最终改变了我的想法 - 无需将用户从 /publish 重定向到根 URL,因为用户不会输入 /publish,并且会有永远不要链接到 [site.com]/publish。相反,我在 /publish 目录中的 .htaccess 文件中添加了以下规则。对于发布子目录的任何请求,这都会产生 403 错误(禁止):http ://httpd.apache.org/docs/current/rewrite/flags.html#flag_f

RewriteCond %{THE_REQUEST} publish
RewriteRule .? - [F]

此外,我已将发布目录添加到 robots.txt,以确保搜索机器人不会索引包含相同数据的两组文件。

4

2 回答 2

0

所以我最终得到的解决方案是在用户碰巧偶然发现 [site.com]/publish 时向用户抛出 403(禁止)错误。我是这样做的:

在根目录的 .htaccess 文件中,我保留了 h5bp 文档中的这条规则:

RewriteCond $1 !^publish/
RewriteRule ^(.*)$ publish/$1 [L]

在 /publish 目录的 .htaccess 文件中,我添加了这条规则,带有 F 标志(禁止):

RewriteCond %{THE_REQUEST} publish
RewriteRule .? - [F]

我希望这对遇到此问题的其他人有所帮助!

于 2012-05-29T20:44:26.983 回答
0

似乎我误读了你的问题。我认为以下内容会将任何内容重定向回根文件夹。

RewriteCond %{THE_REQUEST} " /publish/"
RewriteRule ^publish/(.*) /$1 [R=302,L]

可以肯定的是,我可能还会将 /public 添加到我的 robots.txt 中,以防万一您不小心删除了 htaccess 或其他东西。

解释:RewriteRule 检查请求的 url 是否以 开头,publish/___并将这些 url 重定向到/___. 但是要区分直接请求/publish和重写的 url,/publish您需要检查最初请求的 url。实现这一目标的唯一方法是通过 THE_REQUEST 变量。该变量应该包含类似GET /publish/___ HTTP/1.1直接请求的内容。所以 RewriteCond 检查是否存在<space>/publish/

编辑: 最后的尝试:

RewriteBase /
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteRule ^publish/(.*) /$1 [R=302,L]
于 2012-05-21T17:33:46.217 回答