首页 > 解决方案 > 阻止文件夹,同时允许其中包含一些 url 模式

问题描述

首先是 htaccess 的新手

下来问

我有一个像 public_html/account 这样的结构化文件夹

使用 htaccess,我如何阻止对domain.com/account的访问, 同时允许访问诸如 domain.com/account/login 之类的 URL

图片在这里

这甚至可能吗?我会喜欢这里的一些帮助。

标签: phpapache.htaccess

解决方案


像这样的东西:

选项1

SetEnvIf Request_URI "/account/login$"  allow  

Order Deny,Allow
Deny from all
Allow from env=allow

Satisfy any

不确定您必须输入什么SetEnvIf Request_URI,但它应该是请求 URI(这应该是关闭的)。

把这个放进去account/.htaccess

基本上它使用环境变量来设置一个标志“允许”,如果它匹配一个特定的 URI,那么当你这样做时,allow你可以寻找那个环境变量,只有当 URI 匹配你输入的内容时才会设置。

mod_setenvif模块允许您根据请求的不同方面是否匹配您指定的正则表达式来设置内部环境变量。服务器的其他部分可以使用这些环境变量来决定要采取的操作,以及可供 CGI 脚本和 SSI 页面使用

您还可以像这样添加更多网址:

SetEnvIf Request_URI "/account/login$"  allow  
SetEnvIf Request_URI "/account/logout$"  allow 

使用 Deny 的问题是它看起来不太好。可能有办法解决这个问题,但我不确定如何正确。我想你可以设置一个错误页面,也许。

选项2

您可能只想将其重定向到其他地方。像这样的东西:

RewriteRule ^accounts/?$ /accounts/login [L,R=301]

抱歉,如果我/错了一两个,我总是忘记把它们放在哪里。我也很长时间没有使用复杂的重写了,在我弄清楚如何在 URI 上而不是查询字符串上路由之前,我曾经做过更多的事情。也许是 3-4 年前……哈哈

用于此的正则表达式,URI 以帐户开头并结束(或可选地以斜杠结尾),因此它不应该匹配/accounts/{anything}. 你也可以把它重定向到 index.php 或者你想要的任何地方。

  • ^匹配开始 URI
  • accounts从字面上匹配“帐户”
  • /?匹配/字面上?可选
  • $匹配 URI 的结尾(这很重要)

更新

我查了一下:),就像dooh。

如果您为(拒绝访问)错误设置错误页面(文档),403它将在被阻止并触发403代码时发送到该错误页面:

SetEnvIf Request_URI "/account/login$"  allow  

Order Deny,Allow
Deny from all
Allow from env=allow

Satisfy any

ErrorDocument 403 /error/error.html

因此,我想这取决于您是要发出403拒绝访问还是301永久重定向。我会基于网站的这一部分是否出现在搜索结果中。如果它出现在谷歌上,例如这样做,301因为那么它将(最终)从搜索结果中删除。我这么说,但他们也可能会删除401页面。所以这可能只是个人喜好。

Deny 的一个优点是您还可以对其进行密码保护(在 htaccess 中),这样您就可以通过登录来访问它,但它不会被公开访问。如果您有静态 IP 地址,您也可以使用 IP 地址。最近我为一个使用 的旧网站做了这个CakePHP,这很容易 100 美元(我们将为他做了一些其他的事情,但我离题了)。

干杯!

希望能帮助到你。


推荐阅读