2

我有一种情况,整个文件夹的内容不再需要,并将被重定向到主页,除了 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

提前感谢这个由知识渊博的人组成的精彩社区,帮助我们这些仍有一些东西要学习的人!

编辑

是否有可能实现这一目标并保留文件夹的基本 url?

/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/重定向除少数文件外的所有文件的正确方法/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]
4

2 回答 2

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 重定向,它们可能会相互干扰。

于 2012-09-17T17:21:06.623 回答
1

您可以将RedirectMatch负前瞻一起使用,例如:

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 标志确保在此传递中不进行进一步处理,并-指示引擎不要重写,确保不再进行传递。任何没有被第一条规则捕获的东西都会被第二条规则重定向。

于 2012-09-17T17:24:42.023 回答