如何使用mod_rewrite将文件夹中的所有文件重定向到另一个目录,除了一些文件?

时间:2012-09-17 16:18:47

标签: regex .htaccess mod-rewrite

我的情况是不再需要整个文件夹的内容,并且会被重定向到主页,除了6个左右的文件。该文件夹可容纳300多个文件,因此个人重定向:

redirect 301 /folder/file.html http://www.domain.tld/
redirect 301 /folder/file2.html http://www.domain.tld/
redirect 301 /folder/file3.html http://www.domain.tld/

这需要相当长的时间。我有一些时间需要这样做,并想知道是否有人知道一个很好的方法来实现这一点,通过使用一个与mod_rewrite的小正则表达式。

为了让所有可能使用潜在正确答案的人达到最佳理解,我们可以说我们不想重定向的文件是:

/folder/stay1.html
/folder/stay2.html
/folder/stay3.html

提前感谢这个知识渊博的社区,帮助我们这些仍然需要学习的东西!

修改

是否可以实现此目的并保留文件夹的基本网址?

/folder/
/folder/index.html

我尝试了以下但没有成功:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/folder(/|/index.html|/stay1.html|/stay2.html|/stay3.html|/etc.html)
RewriteRule ^/?folder/ http://www.domain.tld/ [L,R=301]

编辑正确答案

非常感谢Jon Lin获得答案。

重定向/folder/除{1}之外的所有文件的正确方法仍然允许访问/folder/

RewriteEngine On

# Allow /folder/ to remain accessible
RewriteCond %{REQUEST_URI} !^/folder/$

# Allow specified files to remain accessible
RewriteCond %{REQUEST_URI} !^/folder/(index.html|stay1.html|stay2.html|stay3.html|etc.html)

# Redirect all non-specified files to home page
RewriteRule ^/?folder/(.+)$ http://www.domain.tld/ [L,R=301]

2 个答案:

答案 0 :(得分:2)

使用mod_rewrite,您可以为重定向创建异常条件,尝试将这些规则放在文档根目录中的htaccess文件中:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/folder/$
RewriteCond %{REQUEST_URI} !^/folder/(index.html|stay1.html|stay2.html|stay3.html|etc.html)
RewriteRule ^/?folder/(.+)$ http://www.domain.tld/ [L,R=301]

所以列表中的任何内容:(stay1.html|stay2.html|stay3.html|etc.html)都会使条件失败,重定向也不会发生。否则,以/folder/开头的任何内容都将重定向到http://www.domain.tld/

请注意,如果您将mod_alias重定向混合,则它们可能会相互干扰。

答案 1 :(得分:1)

您可以将RedirectMatchnegative lookahead一起使用,例如:

RedirectMatch permanent ^/?folder/(?!(stay1\.html|stay2\.html|stay3\.html)) http://domain.tld

另一种mod-rewrite解决方案是这样的:

RewriteRule ^/?folder/(stay1\.html|stay2\.html|stay3\.html)$ - [L]
RewriteRule ^/?folder/.* http://domain.tld

第一个规则捕获所有异常,L标志确保在此过程中不再进行进一步处理,-指示引擎不要重写,确保不再进行传递。第一条规则未捕获的任何内容都会被第二条规则重定向。