2013-01-13 35 views
0

我一直在寻找很多例子,但只是无法让我的头,这可能是不可能的。我已经继承了一个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 

基本上有超过93000名的文件的文件夹/wp-content/uploads/,有的在2011年和2012年的文件夹。我需要移动93,000个文件,因此决定让文件夹中的“组织”文件夹反映第一个字母/潜在文件的数量。

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

所以:

/wp-content/uploads/APicture.jpg 

将改写到:

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

,同时仍允许访问真实URL,如:

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

我觉得像这样的重写URL的工作,但它不,我已经尝试了很多变化,也许它不能像这样工作?

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

注:为了测试我是检查URL /wp-content/uploads/taylor-swift-harry-styles.jpg这样就是为什么我硬编码生成的URL重写,但我知道它需要改变以匹配首字母。

感谢您的帮助。

回答

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] 

会重定向的URL像这样的:

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,并且必须存在。信件大写时也是如此。

+0

感谢faa,迄今为止这么好。虽然我没有考虑大写/小写问题。这是否意味着我需要同时创建一个“a”和“A”目录,以此类推z/Z,并相应地对文件进行排序?我想这是有道理的,因为它在Linux上,但如果是移植到Windows上,情况并不重要 - 那会是一个问题吗? – Anthony

+0

我不这么认为,尽管在这个问题上有一个单一的策略会更安全一些:我想是符合Linux和HTTP的。 –

+0

好的,我稍微修改它。第一个工作正常,它捕捉到a-z,A-Z和0-9个字符。第二个意思是抓住所有其他的符号,但它不会触发。我究竟做错了什么。 FIRST:RewriteCond%{REQUEST_URI} wp-content/uploads /([A-Za-z0-9])([^ /] +)\。([^ /] +)/? [NC] RewriteRule。* wp-content/uploads/_Organised /%1 /%1%2.%3 [L] SECOND:RewriteCond%{REQUEST_URI} wp-content/uploads /(.*)$/? [NC] RewriteRule。* wp-content/uploads/_Organised/_Misc /%1 [L] – Anthony

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标志放在这是为了杀死?直到我把它放在那里,第二个规则的问题是它会捕获子目录中的文件。 ($)符号在这里保证?

+0

这个'([A-Za-z0-9])'在我的回答中是'[\ w]'加下划线'_',所以¿为什么修改?另一方面,添加2个'REQUEST_FILENAME'条件,因为'RewriteCond%{REQUEST_URI}!wp-content/Organized [NC]'已经阻止了任何循环,因此,为什么修改我的答案为什么它不适合你? “其他”字符/文件不在你的问题中,这就是为什么他们也不在我的答案中。 –

+0

对不起,我没有完全理解正则表达式,我还没有找到解释所有可能输入的资源,例如[\ w]。我找不到它的意思。我将删除额外的RewriteConds。 – Anthony

+0

'\ w'是任何有效的单词字符加下划线'_',包括数字。 –