Apache htaccess将链接中的字符重写到其他目录

Apache htaccess将链接中的字符重写到其他目录,apache,.htaccess,Apache,.htaccess,我正在将一个拥有20000多页和杂项文档的大型网站从一个旧的dream press网站迁移到wordpress网站。旧网站的结构乱七八糟。有许多不同类型的杂项文档分散在数百个不同级别的不同文件夹中。如果可能的话,我不想打破所有的旧链接,而是去一个更符合逻辑的结构 考虑到这一点,我从pdf文档开始。旧链接看起来像 http://www.example.org/agriculture/gaoag/092505.pdf 为了简化它,我想把所有的pdf文件放在一个文件夹中。为了确保我没有命名问题,并且

我正在将一个拥有20000多页和杂项文档的大型网站从一个旧的dream press网站迁移到wordpress网站。旧网站的结构乱七八糟。有许多不同类型的杂项文档分散在数百个不同级别的不同文件夹中。如果可能的话,我不想打破所有的旧链接,而是去一个更符合逻辑的结构

考虑到这一点,我从pdf文档开始。旧链接看起来像

http://www.example.org/agriculture/gaoag/092505.pdf
为了简化它,我想把所有的pdf文件放在一个文件夹中。为了确保我没有命名问题,并且能够将旧链接重定向到现在的链接,我将“/”替换为“\u1”,这样做会使新链接看起来像这样

http://www.example.org/pdf/agriculture_gaoag_092505.pdf
我可以自动化这一部分,我遇到的问题是将旧链接重定向到新链接。我认为使用.htaccess应该可以将“/”替换为下划线,并一次转到一个新目录

使用下面的代码,我可以重定向到正确的文件夹。我如何让它将/to\

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} .*\.pdf$
RewriteCond %{REQUEST_URI} !^/pdf
RewriteRule ^(.*)$ /pdf/$1 [R,L]
编辑:添加另一个示例

http://www.example.org/BOR/2011/2011/OPS/PLAN/040611.pdf
希望得到

http://www.example.org/pdf/BOR_2011_2011_OPS_PLAN_040611.pdf
注意:我在根级别使用.htaccess文件。如果需要,我也愿意在其他地方制作

注2:可能有从no/deep到7 deep的任何地方需要更改

注3:一旦我开始工作,我将对其他文件类型进行更改。

您可以这样做:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/pdf
RewriteCond %{REQUEST_URI} ^/(.+)/(.+)/([0-9]+)\.pdf$
RewriteRule ^   /pdf/%1_%2_%3.pdf [R=301,L]
但是,如果要对其他文件遵循相同的标准,则可以如下方式收集它们,例如:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/(pdf|js|css|html)
RewriteCond %{REQUEST_URI} ^/(.+)/(.+)/(.+)\.(.+)$
RewriteRule ^    /%4/%1_%2_%3.%4 [R=301,L]
根据您的评论,您有不同的级别,请尝试以下操作:

RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_URI} !^/(pdf|js|css|html)
RewriteRule ^([^/]+)/(.*)$   /$1_$2 [L]
RewriteCond %{REQUEST_URI} !^/(pdf|js|css|html)
RewriteCond %{REQUEST_URI}  \.(pdf|js|css|html)$
RewriteRule ^(.+)$   /%1/$1 [R=301,L]

注意:清除浏览器缓存测试。

“我认为使用.htaccess可以将“/”替换为下划线”-如果您已经这么认为,那么您也可以努力实际研究它。。。快到了!这将重定向到文件夹并修复其中的2个/有些文件有多达7个/而且您发布的内容拒绝删除第一个/即使只有一个。@Brandan您在问题中提到的是我在回答时所依据的,因此规则仅适用于您在备注中提到的示例,添加了另一个示例。我不知道为什么这样做有效,但它确实有效!我最后添加了RewriteCond%{REQUEST_FILENAME}-f RewriteCond%{REQUEST_FILENAME}-除了那完美之外@Brandan感谢您的评论,我将向您解释它是如何工作的,第一条规则将捕获任何uri,例如/1/2/3/4。然后将其更改为/1_2/3/4。然后将其更改为/1_2_3/4。然后将其更改为/1_2_3/4。无论如何/1_2_3_4。无论第一条规则如何工作,直到没有/in uri,在第二条规则中,我捕获该/output。无论如何,/1_2_3 _4.随便,然后重定向到/whater/1_2_3_4.随便,明白了吗?