我对mod_rewrite很糟糕,甚至不确定它是否是我最好的方法。
我有一个/ image目录,其中包含20,000个左右的图像。我的webhost说他们将停用我的帐户,除非我得到2500个文件下的每个目录。
所以我想更改它,以便/images/apple.jpg
重定向到/images/a/apple.jpg
,/images/banana.jpg
重定向到/images/b/banana.jpg
,这样每当php文件调用/images/apple.jpg
时将重定向。相反,创建的任何新图像都需要放在正确的目录中。
我想编写PHP来执行此操作,但我的图像目录在736个文件中引用。
如果有人有更好的想法 - 我愿意接受各种想法。
答案 0 :(得分:0)
将.htaccess重定向到新目录似乎不是最好的主意,因为此时您需要至少8个不同的目录(以及8个不同的重写规则)将20000个文件拆分为最多2500个文件的目录。因此,明天将需要9个目录,并没有提到使用重写规则来选择转到每个目录的文件可能会变得非常困难。
我想最好的选择是在PHP脚本中处理该路由,使用数组或任何需要的东西。
您可以将转到/images
目录的所有内容重定向到root中的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
可以包含任何名称,因此如果使用了密钥name
和type
。
必须保留传入的URL结构才能使规则集生效:URL中的最后一个字符串必须是文件。
对于永久性和可见的重定向,请将[L]
替换为[R=301,L]
。