Mod rewrite 重写子目录中的图像

Mod rewrite 重写子目录中的图像,mod-rewrite,rewrite,Mod Rewrite,Rewrite,我已经看了很多例子,但就是无法理解这一点,也许这是不可能的。我继承了一个混乱的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/

我已经看了很多例子,但就是无法理解这一点,也许这是不可能的。我继承了一个混乱的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
基本上,
/wp content/uploads/
文件夹中有93000多个文件,2011和2012文件夹中也有一些文件。我需要移动93000个文件,因此决定制作“有组织”文件夹,其中包含反映潜在文件的第一个字母/数量的文件夹

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

因此:

将重写为:

/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,但我意识到它需要更改以匹配首字母

感谢您的帮助。

您可以尝试以下方法:

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

其中directory
T
是文件名的第一个字符。它可以是一个数字或一个字母


不过,它会把信放在箱子里。例如,如果字母是小写,则映射的目录将是
t
,并且必须存在。当字母大写时也会发生同样的情况。

根据联邦航空局的评论,我修改了我的代码,并将其放在这里以便于阅读

#   !!!
#   !!! 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标志,这是杀戮结束吗?在我把它们放进去之前,第二条规则有一个问题,它将捕获子目录中的文件。这里的($)标志也有保证吗?

谢谢联邦航空局,到目前为止还不错。虽然我没有考虑大小写的问题。那么这是否意味着我将需要创建一个“a”和“a”目录,依此类推到z/z,并相应地对文件进行排序?我想这是有道理的,因为它是在Linux机器上,但如果它是移动到Windows,情况并不重要-那么这会是一个问题吗?我不这么认为,虽然在这方面最好有一个单一的策略:一个符合Linux和HTTP的,我想。好吧,我稍微修改了它。第一个很好用,它可以抓到a-z,a-z和0-9个字符。第二个是用来捕捉其他一切,符号,但它不会开火。我做错了什么。第一:重写第二个%{REQUEST_URI}wp content/uploads/([A-Za-z0-9])([^/]+)\([^/]+)/?[NC]重写规则。*wp content/uploads/%1/%1%2.%3[L]秒:RewriteCond%{REQUEST\u URI}wp content/uploads/(.*)$/?[NC]RewriteRule.*wp content/uploads/\u organized/\u Misc/%1[L]不管评论如何,我发布了可读性代码作为答案。这
([A-Za-z0-9])
是我的答案中的
[\w]
加下划线
\ucode>,为什么要修改?另一方面,您添加了2个
REQUEST\u FILENAME
条件,这些条件在
RewriteCond%{REQUEST\u URI}中是不必要的!wp content/organized[NC]
已经阻止了任何循环,所以,再次强调一下,为什么对我的答案进行修改,为什么它对您不起作用?
“其他”字符/文件…
不在您的问题中,这就是为什么它们也不在我的答案中。很抱歉,我不完全理解正则表达式,我无法找到解释所有可能输入的资源,例如[\w]。我找不到它的意思。我将删除额外的重写条件。
\w
是任何有效的单词字符加下划线,包括数字。
#   !!!
#   !!! 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]