2011-07-14 30 views
1

我已经存储在htaccess重写循环?

/public/upload/* 

例如用户上传的文件:

/public/upload/gallery/segway/child-on-a-segway.jpg 

我目前的.htaccess规则已经消除/public部分,但我仍然需要摆脱/upload部分,但是,仅适用于具有给定扩展名但不包含在其他目录中的文件,例如jsimg。我目前的.htaccess看起来像这样(典型的Zend框架项目):

RewriteEngine On 

RewriteRule ^\.htaccess$ - [F] 

RewriteCond %{REQUEST_URI} ="" 
RewriteRule ^.*$ /public/index.php [NC,L] 

RewriteCond %{REQUEST_URI} !^/public/.*$ 
RewriteRule ^(.*)$ /public/$1 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^.*$ - [NC,L] 

RewriteRule ^public/.*$ /public/index.php [NC,L] 

在摆脱/upload部分工作的希望,我写这在我的.htaccess的末尾:

RewriteCond %{REQUEST_URI} ^(?<!upload|img|js|less|css)/.*(jpg|mp3|png)$ 
RewriteRule ^(.*)$ /upload/$1 

基本上,如果一个文件具有jpg,png或mp3扩展名,并且它的路径不以“upload”,“js”,“css”,“img”或“less”开头,则将前缀“上传”到请求URI 。那么,它失败了。当我在地址栏中输入:http://example.com/gallery/1/php193A.jpg,我得到一个303错误:

You don't have permission to access /upload//public/upload/public/upload/public/upload/public/upload/public/upload/public/upload/public/upload/public/upload/public/gallery/1/php193A.jpg/1/php193A.jpg/gallery/1/php193A.jpg/1/php193A.jpg/upload/public/gallery/1/php193A.jpg/1/php193A.jpg/gallery/1/php193A.jpg/1/php193A.jpg/upload/public/upload/public/gallery/1/php193A.jpg/1/php193A.jpg/gallery/1/php193A.jpg/1/php193A.jpg/upload/public/gallery/1/php193A.jpg/1/php193A.jpg/gallery/1/php193A.jpg/1/php193A.jpg...

和URL的推移和对几十行,就好像是循环。

这是我第一次处理.htaccess重写规则。我会很感激一些帮助他们设置直线,因为我完全迷失在这里。提前致谢。

+0

我实际上是在错误信息笑了相当困难,ahaha – Cyclone

+0

我的客户不会觉得太好玩了,虽然:( – mingos

+0

这就是为什么我目前正在调试它为你笑 – Cyclone

回答

1

你说你“在我的.htaccess”“的末尾写了这个。 TBH我看不出如何应该达到这个规则(规则顺序事项)而不会改变一些其他规则(比如,删除L标志)。

让我们来看看这个请求:/gallery/segway/child-on-a-segway.jpg

  1. 将通过这条规则被改写为/public/gallery/segway/child-on-a-segway.jpgRewriteRule ^(.*)$ /public/$1

  2. 因为没有这样的文件,这将进一步此规则改写为/public/index.phpRewriteRule ^public/.*$ /public/index.php [NC,L]。由于[L]标志重写进入下一次迭代。

  3. 在第二次重写迭代时,该规则RewriteRule ^.*$ - [NC,L]发现/public/index.php确实存在并终止了任何进一步的重写。


考虑上述所有它变得很明显,这样的附加规则需要在中间的某个地方放置,而无需修改任何现有规则。这是规则我出来与你的要求相匹配(根据你试图改写):

RewriteCond %{REQUEST_URI} !^/(public|img|js|css)/.*$ 
RewriteCond %{DOCUMENT_ROOT}/public/upload%{REQUEST_URI} -f 
RewriteRule ^(.+\.(jpg|png|mp3))$ /public/upload%{REQUEST_URI} [NC,L] 

正确的地方来放置它,在我看来,将这个规则之前:RewriteRule ^(.*)$ /public/$1。这样。htaccess将具有以下内容:

RewriteEngine On 

RewriteRule ^\.htaccess$ - [F] 

RewriteCond %{REQUEST_URI} ="" 
RewriteRule ^.*$ /public/index.php [NC,L] 

RewriteCond %{REQUEST_URI} !^/(public|img|js|css)/.*$ 
RewriteCond %{DOCUMENT_ROOT}/public/upload%{REQUEST_URI} -f 
RewriteRule ^(.+\.(jpg|png|mp3))$ /public/upload%{REQUEST_URI} [NC,L] 

RewriteCond %{REQUEST_URI} !^/public/.*$ 
RewriteRule ^(.*)$ /public/$1 

RewriteCond %{REQUEST_FILENAME} -f 
RewriteRule ^.*$ - [NC,L] 

RewriteRule ^public/.*$ /public/index.php [NC,L] 

我已测试它 - 它的工作原理。它可能不是最优化的文件查找执行(-f),但考虑到它只适用于数量有限的扩展(这是一个很好的要求),它应该没问题(如果它是为每个扩展然后它会在繁忙的服务器/负载下减速系统)。

P.S. 据我所知,(?<模式意味着“可变长度后视”(尽管我不是100%确定)。

+0

哇,非常感谢你!它的作用像一个魅力,我怀疑我自己曾经想出这个。 )如果客户端请求扩展的数量可能会变大,例如.flv文件也会上传,但它仍然是一个有限的集合。再次感谢。 – mingos