在子目录中重写图像

时间:2013-01-13 01:29:47

标签: mod-rewrite rewrite

我一直在寻找很多例子,但是我无法理解这一点,可能是不可能的。我继承了一堆Wordpress网站。

我有这个DIR结构,Wordpress:

/wp-content/uploads/
/wp-content/uploads/2011
/wp-content/uploads/2012
/wp-content/uploads/Organised
/wp-content/uploads/Organised/0-9
/wp-content/uploads/Organised/A
/wp-content/uploads/Organised/B
/wp-content/uploads/Organised/ and so on ... to Z

基本上/wp-content/uploads/文件夹中有超过93,000个文件,2011和2012文件夹中有一些文件。我需要移动93,000个文件,因此决定将“Organized”文件夹放在那里,其中包含反映第一个字母/潜在文件数的文件夹。

虽然这不是问题,但移动它们时,我需要确保外部请求仍然可以根据旧URL访问这些文件。

所以:

/wp-content/uploads/APicture.jpg

将重写为:

/wp-content/uploads/Organised/A/APicture.jpg

虽然仍允许访问实际的URL,例如:

/wp-content/uploads/2012/AnotherPicture.jpg

我认为像这样的重写网址可以正常工作,但它没有,我尝试了很多变化,也许它不能像这样工作?

RewriteRule ^/wp-content/uploads/([^/]+)(\.png|\.jpg|\.bmp|\.gif)$ /wp-content/Organised/T/$1$2

注意:为了测试我正在检查网址/wp-content/uploads/taylor-swift-harry-styles.jpg,这就是为什么我硬编码生成的重写网址但我意识到需要进行更改以匹配首字母。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

你可以试试这个:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !wp-content/Organised   [NC]
RewriteCond %{REQUEST_URI} wp-content/uploads/(\w)([^/]+)\.(png|jpg|bmp|gif)/? [NC]
RewriteRule .*   wp-content/Organised/%1/%1%2.%3    [L]

它会重定向这样的网址:

http://example.com/wp-content/uploads/Taylor-swift-harry-styles.jpg

但不喜欢这个:

http://example.com/wp-content/uploads/2012/Taylor-swift-harry-styles.jpg

要:

http://example.com/wp-content/Organised/T/Taylor-swift-harry-styles.jpg

目录T是文件名的第一个字符。它可以是一个数字或一个字母。

但是,它会保留信件的情况。例如,如果字母为小写,则映射的目录将为t必须存在。当字母大写时也是如此。

答案 1 :(得分:0)

根据Faa的评论,我修改了我的代码并将其放在这里以便于阅读。

#   !!!
#   !!! Requires directories to be present: a-z; A-Z; 0-9
#   !!!

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !wp-content/uploads/_Organised   [NC]
RewriteCond %{REQUEST_URI} wp-content/uploads/([A-Za-z0-9])([^/]+)\.([^/]+)$/? [NC]
RewriteRule .* wp-content/uploads/_Organised/%1/%1%2.%3 [L]

#   !!!
#   !!! Matches "Other" characters/files that were not caught above
#   !!!

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !wp-content/uploads/_Organised   [NC]
RewriteCond %{REQUEST_URI} wp-content/uploads/(.*)$/? [NC]
RewriteRule .* wp-content/uploads/_Organised/_Misc/%1 [L]

我认为它有效,似乎是我与正则表达式合作?我需要确保/wp-content/uploads/的唯一文件匹配且没有更深。

这就是为什么我把-f和-d标志放在一起,这是否过度杀戮?直到我把那些放在第二个规则的问题,它会捕获子目录中的文件。这里还保证($)符号吗?