2013-02-08 80 views
0

我对mod_rewrite感到可怕,甚至不确定它是否是我最好的方法。使用htaccess将目录/文件夹拆分成小目录mod_rewrite

我有一个/图像目录中有20,000个左右的图像。我的网络主机说他们会停用我的帐户,除非我得到每个目录下的2500个文件。

所以我想改变它,这样/images/apple.jpg重定向到/images/a/apple.jpg,并/images/banana.jpg重定向到/images/b/banana.jpg这样,每当一个PHP文件调用/images/apple.jpg会重定向。相反,任何新创建的图像都需要放在正确的目录中。

我想代码PHP来做到这一点,但我的图像目录被引用736个文件。

如果有人有更好的想法 - 我愿意接受。

回答

0

重定向到新目录的.htaccess似乎并不是最好的想法,因为此时需要至少8个不同的目录(和8个不同的重写规则)才能将20000个文件分割成最多包含2500个文件的目录。所以,明天将需要9个目录,而不是提及使用重写规则来选择转到每个目录的文件可能变得非常困难。

我想最好的选择是在PHP脚本中处理该路由,使用数组或任何需要的路由。

你可以重定向转到/images目录PHP脚本中的根,例如,这反过来又重定向到相应的目录根据传递给脚本

像这样的参数的一切:

Options +FollowSymlinks 
RewriteEngine On 
RewriteBase/
RewriteCond %{REQUEST_URI} !handler.php 
RewriteCond %{REQUEST_URI} ^/images/([^\.]+)\.([\w]+)/? [NC] 
RewriteRule .* handler.php?name=%1&ext=%2 [L] 

地图默默:

http://example.com/images/filename.ext带或不带斜线。

要:

http://example.com/handler.php?name=filename&type=ext

只传递一个参数到脚本,而不是或名称和扩展,只需更换这一个重写规则:

RewriteRule .* handler.php?%1.%2 [L] 

这是只是一个例子。脚本handler可以具有任何名称,如果使用的话,则可以使用密钥nametype

必须保留传入的URL结构才能使规则集工作:URL内的最后一个字符串必须是该文件。

对于永久和可见重定向,请将[L]替换为[R=301,L]

+0

这是有道理的,我看到这可以工作 - 我可以试试这个。我只关心效率问题,因为处理程序可能会在单个页面载入中被调用数百次。不过,我还是看到了能够在处理程序文件中轻松更改规则的价值。 谢谢! – dragon1234

+0

@Peter PHP通常比mod_rewrite规则更快,但在这种情况下,一堆规则太多而无法检查,所以对性能的影响应该更小,我猜。 –

+0

你好@faa, 感谢您的全力帮助。 我该如何处理handler.php?我尝试了回声和回报,并没有真正的运气。 ' ' – dragon1234