【问题标题】:htaccess - filter public and private requestshtaccess - 过滤公共和私人请求
【发布时间】:2014-03-20 07:51:18
【问题描述】:

我正在我的网站上为我的图像构建一个文件系统,我想要一个用于公共图像的文件夹树和一个用于私有图像的私有文件夹树。我的系统已经使用以下 .htaccess 规则为图像创建了微小的 url:

RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteRule ^(.)(..)(..)(.*)$ ./pictree/head/$1/$2/$3/$1$2$3$4.png

所以这个请求:

www.mysite.com/1234567

会去:

htdocs/pictree/head/1/23/45/12345657.png

我想修改文件夹结构以包括公共和私人文件夹:

htdocs/pictree/public/1/23/45/12345657.png

htdocs/pictree/private/1/23/45/12345657.png

如果请求来自我们本地网络上的 IP 地址,.htaccess 将尝试访问私有文件树中的文件,然后是公共文件树。

所有其他请求只能访问公共树。

我猜新规则是这样的:

RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteCond %{REMOTE_ADDR} ^###\.###\.##
RewriteRule ^(.)(..)(..)(.*)$ ./pictree/private/$1/$2/$3/$1$2$3$4.png

RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteRule ^(.)(..)(..)(.*)$ ./pictree/public/$1/$2/$3/$1$2$3$4.png

我该如何完成它?

【问题讨论】:

  • 你已经有这个规则了,还有什么不行?

标签: php apache .htaccess mod-rewrite filesystems


【解决方案1】:

你应该使用 N 标志在匹配到第一个重写规则后重新运行重写过程:

#check private image
RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteCond %{REMOTE_ADDR} ^###\.###\.##
RewriteRule ^(.)(..)(..)(.*)$ ./pictree/private/$1/$2/$3/$1$2$3$4.png [N]

#if private image not exist and we are requesting from internal network try public image
#these rewrite rules are dedicated for sub-request
RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteCond %{REMOTE_ADDR} ^###\.###\.##
RewriteRule ^pictree/private/(.*)$ ./pictree/public/$1

#in other cases get public image
RewriteCond %{SCRIPT_FILENAME} !-d  
RewriteCond %{SCRIPT_FILENAME} !-f  
RewriteRule ^(.)(..)(..)(.*)$ ./pictree/public/$1/$2/$3/$1$2$3$4.png

【讨论】:

  • 谢谢,我以前从未使用过[N]。快速提问,“./pictree/public/$1.png”最后是否需要“.png”?
猜你喜欢
  • 2015-12-11
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2014-07-14
  • 2012-08-31
  • 2014-08-21
  • 2017-02-17
  • 2012-08-03
相关资源
最近更新 更多