我正在尝试创建一个永久的(301)重定向,将目录中的所有文件重定向到该目录内的单个文件。
例如,如果用户访问 site.com/directory/randompage.html,我希望他们被重定向到 site.com/directory/index.html。
我尝试在目录中放置重定向,然后在文件级别覆盖重定向,但 IIS 似乎不允许这样做。
有什么办法可以实现我想要的目标吗?还是我必须逐个文件地创建重定向?
答案1
对于尝试访问不存在的文件,您可以在目录中放置自定义 404 错误,将用户重定向到您希望他们访问的文件的 URL。
如果有是您必须逐个文件地对该目录中的其他文件进行重定向。不幸的是,情况就是这样。如果您有很多文件,您可以编写元数据库修改脚本来添加重定向。
编辑:
如果您可以修改所有这些文件的 NTFS ACL 以禁止用户读取它们,那么您也可以在目录中删除自定义的 401.3 错误页面。
如果没有的话,请尝试以下操作:
@echo off
SET SOURCE_DIR=C:\path-to-directory-in-filesystem
SET ADSUTIL=cscript C:\inetpub\adminscripts\adsutil.vbs
SET METABASE_PATH=W3SVC/####/ROOT/path/to/site/directory
SET REDIRECT_URL=/foo/foo.txt
for /f "usebackq delims=" %%i in (`dir /b %SOURCE_DIR%`) do (
%ADSUTIL% CREATE %METABASE_PATH%/%%i
%ADSUTIL% SET %METABASE_PATH%/%%i/KeyType "IIsWebFile"
%ADSUTIL% SET %METABASE_PATH%/%%i/HttpRedirect "%REDIRECT_URL%, PERMANENT"
)
将 SOURCE_DIR 设置为文件系统中要进行重定向的文件所在目录的物理路径。如果您使用的是 IIS 6 原版安装,则 ADSUTIL 可能设置正确。METABASE_PATH 需要引用站点标识符编号(示例中的 ###,从您站点的 IIS 管理控制台获取)和根目录下的路径(将 /ROOT/ 保留在那里 - 这是必需的)。最后,REDIRECT_URL 需要是 URL(可以是绝对 URL,也可以是相对于站点根目录的 URL)。
答案2
您应该能够使用 URL 重写模块来执行此操作。据我所知,IIS6 及更早版本有 2 个 URL 重写模块,IIS7 有自己的模块(最后)。
你可以看看 Helicon 的ISAPI_重写或者Ionics Isapi 重写(也适用于 IIS7)。我使用 Ionics,因为它是免费的,但我认为 Helicon 的重写规则直接与 mod_rewrite Apache 模块的规则对应,这总体上对它来说是一大优势。
两者都能够提供永久重定向,并且规则基于正则表达式。我会看看我是否可以整理出一条规则的语法,该规则涵盖了您想要执行的操作,然后很快发布它。
答案3
另一个选项(只是将它放在那里)是,您可以告诉 IIS 让 ASP.Net 处理该站点中的 .html,然后创建一个 global.asax 文件,其中包含检查 URL 并相应地重定向的 Application_BeginRequest 代码。
答案4
您说的所有这些元数据库修改——数千个文件?您可以使用一个通配符规则来执行此操作免疫学与免疫学研究所。
RedirectRule ^/directoryToRedirect/(.*)(?<!index\.html)$ /index.html [L]
英文中,它表示对于目录中的任何 URL目录要重写,这不是 index.html,请将其重定向到 index.html 。
无论您有多少个文件,无论您添加新文件、删除文件还是其他什么,这都可以起作用。