0

我一直在查看许多示例,但无法理解这一点,可能是不可能的。我继承了一个 Wordpress 网站的烂摊子。

我有这个目录结构,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

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

虽然这不是问题,但通过移动它们,我需要确保外部请求仍然可以基于旧 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 进行硬编码,但我意识到它需要更改以匹配首字母。

感谢你的帮助。

4

2 回答 2

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 标志的原因,这是过度杀戮吗?直到我把它们放进去之前,第二条规则存在一个问题,它会捕获子目录中的文件。($) 符号在这里也有保证吗?

于 2013-01-13T12:08:39.457 回答
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并且必须存在。当字母为大写时也会发生同样的情况。

于 2013-01-13T09:13:34.847 回答