2011-10-15 64 views
5

我在处理一些应该很简单的事情时遇到了一些麻烦。我想301将目录中的所有内容重定向到新位置中的单个文件。将301从一个目录重定向到一个文件

在我.htaccess,我已经尝试了以下...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/index.html 

这...

Redirect 301 /myDir/ http://www.mydomain.com/myNewDir/ 

这...

Redirect 301 /myDir http://www.mydomain.com/myNewDir 

问题是每个人都简单地映射01内的每个文件,并将其附加到目标网址的末尾。

谷歌搜索后,我看到的东西,说要做到这一点...

Redirect 301 ^/myDir(.*) http://www.mydomain.com/myNewDir 

但是,这只是做同样的事情...它映射现有的文件位置的URL的结尾。

很容易在网上找到很多“.htaccess重定向”教程,但它们似乎只显示了诸如“一对一文件映射”或“一对一目录映射”的明显例子。这些教程似乎也忽略了解释各种相关的文件指令以及如何正确使用它们。

此特定的托管帐户是垃圾并且还安装了FrontPage扩展。修改重写失败(打破整个站点),但Redirect 301线路正常运行。因此,直到我可以将这个新的(非FrontPage)网站迁移到更强大的主机帐户,我需要坚持使用Redirect 301单行。


我怎么能简单地用一个Redirect 301一切/myDir/重定向到位于/myNewDir/index.html同一个文件? (如果可能,我宁愿只使用/myNewDir/)。 请详细解释您的解决方案中使用的文件指令。


UPDATE:

以前接受的答案是行不通的。

例子:

RedirectMatch 301 /myDir1/(.*) http://mydomain.org/newpath/myDir1/index.html 

...是给“重定向过多发生试图打开”错误。

这是因为/myDir1/(.*)是字符串中的匹配任何地方因此,如果目标URL中包含/myDir1/的任何地方,而不仅仅是根,它会被重定向到一个讨厌的循环。

查看我自己发布的答案以获得正确的解决方案。

回答

12

我在其中一个旧项目中找到了答案。

Redirect 301对此都是错误的。我真的想要RedirectMatch 301

RedirectMatch 301 ^/myDir/(.*) http://www.mydomain.com/myNewDir/ 

说明(S):

http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch

“该指令相当于重定向,但利用标准 正则表达式,而不是简单的前缀匹配”

http://www.zytrax.com/tech/web/regex.htm

“方括号外的^(弯曲或插入符号)是指仅看 目标字符串的开头,例如,^运会找不到 的Windows中STRING1但^ Moz会找到Mozilla。“

和...

“。(句)是指在这个位置上的任何字符(S),例如, 吨。会发现吨,语气和行李箱而不是肆意因为它没有 以下字符。“

和...

*(星号或星)前面的字符匹配0或更多 倍,例如,唱到tre会发现树(2次)和胎面( 1次) 和低谷(0次)*

+0

很好,谢谢。这开始让我发疯。这适用于将整个目录(每页内)的内容引导到给定页面。 – Tom

+0

另外值得一提的是,如果您之前有301重定向到错误的位置(将页面附加到目标URL),您可能需要清除浏览器缓存,然后才能从.htaccess获取新规则。 – Russ

1

试试这个:

RedirectMatch 301 /myDir/.* http://www.mydomain.com/myNewDir/index.html 

参考:http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch

至于括号。*而言,RedirectMatch使用标准正则表达式,这意味着你可以捕获匹配的字符,并利用它们在你的重定向规则refferencing他们为$ 1,$ 2等

在常规表达式*表示前一个字符的任意数量的重复。 。 - 表示任何字符。所以组合*表示这个模式匹配任意数量的任何字符。因此*。 *表示此模式将匹配/ myDir和/ myDir /,仍然是/myDir/test.html。所以*。 *也可以使用

+0

是的,那是有效的。我知道'。*'匹配所有文件。但你能扩展一下吗?任何变化?为什么'(。*)'也起作用?在线文档的链接?谢谢! – Sparky

+0

请参阅:http://httpd.apache.org/docs/1.3/mod/mod_alias.html#redirectmatch关于括号。* RedirectMatch使用标准正则表达式,这意味着您可以捕获匹配的字符并将它们用于您的重定向规则中,将它们引用为$ 1,$ 2等。 – dfsq

+0

在正则表达式中*表示前一个字符的任意数量的重复。 '.' - 表示任何字符。所以组合*表示这个模式匹配任意数量的任何字符。因此*。 *表示此模式将匹配/ myDir和/ myDir /,仍然是/myDir/test.html。所以*。 *也可以使用。 – dfsq

相关问题