Перезапись URL-адреса с помощью IIS с использованием ColdFusion

Я немного поискал, но просто не могу собрать все воедино. Вот что мне нужно:

Я бы хотел, чтобы кто-то занимался серфингом:

www.mysite.com/thisPlace

и перенаправить их на

www.mysite.com/template.cfm?pm=ms&loc_id=4

Для этого мне каким-то образом нужно зафиксировать, что они не запрашивали существующий файл в своем http-запросе, и запустить страницу .cfm, которая запросила в базе данных запись, где locationName = 'thisPlace', а затем перенаправить их на страницу, подобную шаблону. .cfm?pm=ms&loc_id=4, где 4 — это идентификатор записи строки, соответствующей 'thisPlace'


person Bill_VA    schedule 20.07.2015    source источник
comment
Почему это помечено PHP ?   -  person CD001    schedule 20.07.2015
comment
Понятия не имею, я не видел его, когда отправлял. Извините, я удалил это.   -  person Bill_VA    schedule 20.07.2015


Ответы (3)


Если для вашего документа по умолчанию в IIS установлено значение index.cfm, вы можете создать папку (каталог) с именем «thisPlace» и поместить файл index.cfm, который не содержит ничего, кроме тега <cflocation> и сопутствующего запроса/логики для определения URL-адреса.

Сайт Website.com/thisPlace будет работать так, как вы описываете.

Редактировать:

Вы можете добавить пользовательскую страницу 404...

введите здесь описание изображения

Сделайте это файлом .cfm вместо html. Просканируйте путь к шаблону, чтобы увидеть, что ищет пользователь. Если вы найдете его в своей базе данных, перенаправьте их туда, в противном случае перенаправьте их на общую страницу 404.

<!---Up to a certain point (the directory in which you store your code) this will always be the same so you can hard-code your number --->
<cfset QueryConstant = #LEFT(CGI.CF_Template_Path, 22)#>
<!---Find the overall length of the template path. --->
<cfset QueryVariable = #Len(CGI.CF_Template_Path)#>
<!---Take whatever is past your QueryConstant (AKA the string that produces a 404 error.) --->
<cfset theRightNumber = QueryVariable - 22>
<cfset QuerySearchString = #RIGHT(CGI.CF_Template_Path, theRightNumber)#>



<cfquery name="ListOfLocations" datasource="CRM">
    SELECT TOP 1 LocationID
    FROM LocationTable
    WHERE LocationName LIKE '%#QuerySearchString#%'
</cfquery> 

<cfif ListOfLocations.recordcount>
<cflocation url="/SomePage.cfm?LocationID=#ListOfLocations.LocationID#">
<cfelse>
<cflocation url="/Regular404page.html">
</cfif>
person TRose    schedule 20.07.2015
comment
Это может сработать, однако существует более 300 уникальных местоположений (например, thisPlace). Я надеялся на что-то более общее, что не требовало бы наличия физической папки. - person Bill_VA; 20.07.2015
comment
@Bill_VA отредактировал мой ответ. Я просто закодировал это на лету, но это должно работать для того, что вы делаете. - person TRose; 20.07.2015
comment
у меня есть что-то вроде этого, но на apache, но я использую CGI.REDIRECT_URL из моего 404.cfm, который дает мне все после mysite.com. я также поместил CGI.REDIRECT_URL в cfqueryparam - person luke; 21.07.2015
comment
Кроме того, вы можете включить STATUSCODE=301 в свой cflocation для постоянных перенаправлений и STATUSCODE=404 для обычных 404-х. - person luke; 21.07.2015
comment
@Люк, это правильно. Добавление кодов состояния и url-токенов может быть очень полезным, но в конечном итоге это решение остается за OP. Хороший улов однако. - person TRose; 21.07.2015

Спасибо, парни! Огромная помощь! Используя ваши данные, вот что я сделал: (пришлось использовать QUERY_STRING вместо CF_Template_Path, так как CF_Template_Path ничего не передал после URL-адреса пользовательской страницы ошибок.

Я установил пользовательскую ошибку 404 Execute URL в IIS для файла с именем check404error.cfm.

Когда кто-то ищет www.example.com/thisPlace, IIS отправляет их на http://www.example.com/check404error.cfm. Я использую CGI.QUERY_STRING (404;http://www.example.com:443/thisPlace), чтобы в конечном итоге получить строку «thisPlace» для поиска.

<!---Up to a certain point (the directory in which you store your code) this will always be the same so you can hard-code your number --->
<cfset QueryConstant = #LEFT(CGI.QUERY_STRING, 31)#>
<!---Find the overall length of the template path. --->
<!---31 is the length of '404;http://www.example.com:443/' --->
<cfset QueryVariable = #Len(CGI.QUERY_STRING)#>
<!---Take whatever is past your QueryConstant (AKA the string that produces a 404 error.) --->
<cfset theRightNumber = QueryVariable - 31>
<cfset QuerySearchString = #RIGHT(CGI.QUERY_STRING, theRightNumber)#>

<cfquery name="ListOfLocations"  datasource="#request.dsn#">
 	SELECT location.id
	FROM location WHERE url_name = <cfqueryparam value="#QuerySearchString#" cfsqltype="CF_SQL_VARCHAR" maxlength="255"> LIMIT 1   
</cfquery> 

<cfif ListOfLocations.recordcount>
	<cflocation url="https://example.com/template.cfm?pm=ms&loc_id=#ListOfLocations.id#" addtoken="no" statusCode="301">
<cfelse>
	<cflocation url="/404error.cfm" addtoken="no">
</cfif>

person Bill_VA    schedule 20.07.2015

Именно так сегодня работает самый популярный MVC Framework, анализируя сегменты URL.

Есть ли у вас доступ к какому-либо программному обеспечению для перезаписи URL-адресов?

Поскольку вы используете IIS, у него есть встроенный механизм перезаписи, в котором вы можете просто переписать такие запросы в известный файл, что избавит вас от накладных расходов на отправку ответа 404 и его анализ, а также создание дополнительных запросов в результате этого.

Подробнее см. http://wiki.coldbox.org/wiki/URLMappings.cfm. Мы используем версию перезаписи Isapi, чтобы делать именно то, что вы просите.

  • Получить запрос на www.mysite.com/thisPlace
  • thisPlace не является каталогом
  • thisPlace не является файлом
  • Повторно отправить на index.cfm или в другое место по вашему выбору для дополнительного анализа
  • Helicon Rewrite отправляет HTTP-заголовок с именем HTTP_X_REWRITE_URL с исходным запрошенным URL-адресом, поэтому его анализ очень прост.

Все это происходит внутри одного запроса, поэтому клиент никогда не перенаправляется.

person jfrobishow    schedule 21.07.2015