cflocation против cfheader для перенаправлений 301
Я "переименовываю" существующий файл для проекта, над которым я работаю. Чтобы поддерживать обратную совместимость, я оставляю файл cfm на месте, чтобы перенаправить пользователей на новый.
- buy.cfm: старый
- shop.cfm: новый
Чтобы сохранить все как можно более чистым, я хочу отправить ответ с кодом статуса 301, если пользователь попытается перейти на buy.cfm.
Я знаю, что я могу использовать либо cflocation
с statuscode
атрибут
<cflocation url="shop.cfm" statuscode="301" addtoken="false">
или я могу использовать cfheader
теги.
<cfheader statuscode="301" statustext="Moved permanently">
<cfheader name="Location" value="http://www.mysite.com/shop.cfm">
Есть ли причины использовать один метод над другим?
2 ответа
Я думаю, что они делают то же самое, с <cflocation>
быть более читабельным
Я проверил это на ColdFusion 9.
Есть одно существенное отличие, и это то, что cflocation останавливает выполнение страницы, а затем перенаправляет на указанный ресурс.
Из документации Adobe ColdFusion:
Останавливает выполнение текущей страницы и открывает страницу ColdFusion или файл HTML.
Так что вам нужно сделать это:
<cfheader statuscode="301" statustext="Moved permanently">
<cfheader name="Location" value="http://www.example.com/shop.cfm">
<cfabort>
чтобы получить эквивалент этого:
<cflocation url="shop.cfm" statuscode="301" addtoken="false">
В противном случае вы рискуете столкнуться с проблемами, если другой код запускается после тега cfheader. Я сталкивался с этим при исправлении некоторого кода, в котором перенаправления вставлялись в файл application.cfm - с использованием cfheader - без прерывания обработки остальной части страницы.
Я также заметил в заголовках ответов, что cflocation также устанавливает следующие заголовки соответственно:
Cache-Control: no-cache
Pragma: no-cache
Можно добавить эти заголовки, если при необходимости используется тег cfheader с Location:
<cfheader name="Cache-Control" value="no-cache">
<cfheader name="Pragma" value="no-cache">
Чтобы уточнить ответ Энди Тайрона, хотя они МОГУТ делать то же самое при определенных обстоятельствах, метод CFHEADER дает вам больший контроль над заголовками, передаваемыми в запросе. Это становится полезным, например, если вы хотите отправлять заголовки управления кэшем в браузер или сеть доставки контента, чтобы они не продолжали атаковать ваш сервер с тем же старым запросом перенаправления. Нет никакого способа (насколько мне известно) сказать CFLocation для кэширования перенаправления.