Я пытаюсь создать постоянное (301) перенаправление всех файлов в каталоге в один файл в этом каталоге.
Например, если пользователь посещает site.com/directory/randompage.html, я хочу, чтобы он был перенаправлен на site.com/directory/index.html.
Я попытался перенаправить каталог, а затем переопределить перенаправление на уровне файлов, но IIS, похоже, не позволяет этого.
Есть ли способ добиться того, что мне нужно? или мне нужно создать перенаправление для каждого файла?
Для попытки доступа к файлам, которые не существуют, вы можете поместить в каталог настраиваемую ошибку 404, которая перенаправляет пользователя на URL-адрес файла, к которому вы хотите, чтобы он получил доступ.
Если здесь являются другие файлы в этом каталоге вам нужно будет перенаправить на них пофайлово. К сожалению, так оно и есть. Если у вас много файлов, вы можете создать сценарий модификации метабазы для добавления перенаправления.
Редактировать:
Если вы можете изменить списки ACL NTFS для всех этих файлов, чтобы запретить пользователю их читать, вы также можете удалить в каталоге настраиваемую страницу с ошибкой 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 на физический путь в файловой системе каталога с файлами, которые нужно преобразовать в перенаправления. ADSUTIL, вероятно, настроен правильно, если у вас установлена стандартная версия IIS 6. METABASE_PATH должен ссылаться на номер идентификатора сайта (### в примере, получить его из консоли управления IIS для вашего сайта) и путь под корнем (оставьте / ROOT / там - что необходимо). Наконец, REDIRECT_URL должен быть URL-адресом (может быть абсолютным или относительным к корню сайта).
Другой вариант (просто для того, чтобы он был там): вы могли бы указать IIS, чтобы ASP.Net обрабатывал .html на этом сайте, а затем создал файл global.asax с кодом Application_BeginRequest, который проверяет URL-адрес и соответственно перенаправляет.
Для этого у вас должна быть возможность использовать модуль перезаписи URL. Есть 2, о которых я знаю для IIS6 и ранее, у IIS7 есть собственный модуль (наконец).
Вы можете посмотреть на Helicon ISAPI_Rewrite или Ionics Isapi Rewrite (также работает с IIS7). Я использую Ionics, потому что это бесплатно, но правила перезаписи Helicon, как я полагаю, сопоставляются непосредственно с правилами модуля mod_rewrite Apache, что в целом является для него большой победой.
Оба имеют возможность предоставлять постоянные перенаправления, а правила основаны на регулярных выражениях. Я посмотрю, смогу ли я составить синтаксис правила, охватывающего то, что вы хотите сделать, и опубликую его в ближайшее время.
Все эти модификации метабазы - ты говоришь, тысячи файлов? Вы можете сделать это с помощью одного правила подстановки в IIRF.
RedirectRule ^/directoryToRedirect/(.*)(?<!index\.html)$ /index.html [L]
По-английски сказано, что для любого URL в каталоге directoryToRewrite, который НЕ является index.html, перенаправьте его на index.html.
Это работает независимо от того, сколько у вас файлов, добавляете ли вы новые файлы, удаляете файлы и т. Д.