С Coldfusion, как вы обрабатываете динамически генерируемые URL? - PullRequest
3 голосов
/ 16 декабря 2009

(Обновление: я преобразовал этот вопрос в вики сообщества, поскольку ответ кажется более субъективным, чем я думал. Существует несколько ответов в зависимости от потребностей.)

Если у меня есть папка, содержащая только application.cfc и index.cfm, какой быстрый и надежный метод для обработки динамически генерируемых URL-адресов? то есть URL, которые не имеют соответствующего физического файла .cfm.

В этом примере url генерирует 404, но он должен найти страницу в БД и вернуть ее через index.cfm:

http://www.myserver.com/cfdemo/mynewpage.cfm

Должен ли я использовать onMissingTemplate () в application.cfc для обработки отсутствующего файла? Поскольку этот метод не обрабатывает onRequestStart (), onRequest () и onRequestEnd (), мне интересно, следует ли этого избегать.

С другой стороны, я мог бы установить правило ISAPIRewrite, так как я использую IIS (или mod_rewrite на Apache)

# IF the request is not /index.cfm, doesn't exist and ends in cfm or html,
# rewrite it. Pass the requested filename $1.$2 as the 1st param: cgi.page
# append the remaining url params $4 ($3 is the ?)
RewriteCond %{SCRIPT_NAME} ^(?!/index.cfm)(.*)$
RewriteCond %{REQUEST_FILENAME}     !-f
RewriteCond %{REQUEST_FILENAME}     !-d 
RewriteRule ^\/(.*)\.(cfm|html)(\??)(.*)$   /index.cfm?page=$1.$2&$4 [I,L]

Являются ли эти методы подходящими или я упускаю лучший способ достижения этой цели? Похоже, что Coldfusion должен иметь встроенную функцию такого типа в application.cfc. Может быть, я просто скучаю по нему.

Ответы [ 5 ]

4 голосов
/ 16 декабря 2009

ничего плохого в перезаписи URL на уровне веб-сервера. Я бы за это проголосовал.

2 голосов
/ 16 декабря 2009

Поскольку CF по умолчанию обрабатывает только запросы cfm / cfc, вы можете сделать в начале Application.cfc что-то вроде этого:

<cfif Right(cgi.SCRIPT_NAME, 9) NEQ "index.cfm">
    <!--- analyze the SCRIPT_NAME and start processing --->
</cfif>

Для других типов файлов, использующих конфигурацию веб-сервера, это единственный способ, который я вижу. Но вместо создания правил переписывания вы можете попробовать использовать пользовательские обработчики 404. По крайней мере, при использовании IIS вы сможете получить контекст в cgi.QUERY_STRING, если настроите фиктивную страницу, скажем 404.cfm (она не должна существовать) и поставьте следующую проверку до предыдущий пример:

<!--- trap 404 requests triggered by IIS --->
<cfif right(cgi.SCRIPT_NAME, 7) EQ "404.cfm">
    <cflog file="mylogfile" text="404 error triggered by IIS. Context: #cgi.QUERY_STRING#">
</cfif>

Для Apache можно использовать следующий обработчик, но я не уверен, что вы можете извлечь контекст в этом случае:

ErrorDocument 404 /404.cfm
1 голос
/ 16 декабря 2009

Если вы делаете это для URL-адресов SES, я бы предложил два совета.

Во-первых, с течением времени они все меньше значат. Например, Google признает, что URL-адреса должны включать данные запроса.

Второе: CF может изначально обрабатывать URL-адреса SES в форме hostname / file.cfm / param1 / param2. Например, BlogCFC Рэя Камдена работает именно так. По умолчанию он включен в CF8, но его необходимо включить в CF7. У меня нет много полезной информации по этому вопросу, но это должно быть легко для Google (или Bing, или что-то еще).

0 голосов
/ 23 декабря 2009

Я бы определенно пошел на переписывание URL. Это будет не только более предсказуемый, но и обобщенный подход, но он также уменьшает значительную нагрузку при разборе строк с сервера CF. Кроме того, это приводит к тому, что CF обрабатывает запрос к реальному файлу, что дает вам преимущество onapplicationstart, onrequeststart и других событий.

Кроме того, я лично всегда находил URL-адреса, такие как /index.cfm/foo/bar/, которые выглядят непрофессиональными и хакерскими. Кроме того, URL-адреса (например, / foo / bar), которые не заканчиваются ни расширением файла, ни конечной косой чертой, являются технически некорректными (по крайней мере, в соответствии с соглашениями о статических сайтах старой школы) и их, вероятно, следует также избегать. Мне также было бы любопытно, откуда Бен Дум получает свое утверждение о том, что «во-первых, они имеют значение все меньше и меньше с течением времени. Например, Google признает, что URL-адреса должны включать данные запросов». По своему опыту я обнаружил, что с точностью до наоборот.

0 голосов
/ 20 декабря 2009

Если вы можете разрешить это, я бы попытался преобразовать URL-адреса как:

http://www.myserver.com/cfdemo/mynewpage.cfm

до:

http://www.myserver.com/cfdemo/mynewpage OR
http://www.myserver.com/index.cfm/cfdemo/mynewpage

чтобы не потерять onRequest методы. Первое можно сделать только на уровне веб-сервера, то есть в Apache или IIS. Второе можно сделать просто в ColdFusion. Смотрите это: http://www.cfcdeveloper.com/index.cfm/2007/4/7/Coldfusion-SES-URL.

В противном случае, если у вас должен быть .cfm в конце, вы можете использовать пакет перезаписи URL в Apache или IIS, чтобы удалить его, а затем направить запрос на страницу cfm или сделать то, что вы делаете с onMissingTemplate. Я бы попробовал выбрать решение, которое не предполагает потерю методов onRequest, но зависит от вас.

...