مع ColdFusion، كيف يمكنك التعامل مع عناوين URL التي تم إنشاؤها ديناميكي؟

StackOverflow https://stackoverflow.com/questions/1916555

سؤال

(التحديث: قمت بتحويل هذا السؤال إلى مجتمع Wiki حيث يبدو الجواب أكثر عرضية مما اعتقدت أنه سيكون. هناك إجابات متعددة اعتمادا على احتياجات المرء.)

إذا كان لدي مجلد يتضمن فقط Application.cfc و Index.cfm، فما هي طريقة سريعة وموثوقة للتعامل مع عناوين URL التي تم إنشاؤها ديناميكيا؟ أي عناوين URL التي لا تحتوي على ملف .cfm المادي المقابل.

يولد عنوان URL هذا المثال 404، ولكن يجب أن يبحث صفحة في DB وإرجاعه عبر Index.cfm:

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

هل ينبغي أن أستخدم onmissingtemplate () في التطبيق .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. ربما أنا فقط أفتقدها.

هل كانت مفيدة؟

المحلول

لا شيء خاطئ مع إعادة كتابة عنوان URL على مستوى خادم الويب. سأصوت لذلك.

نصائح أخرى

نظرا لأن CF من خلال المقابض الافتراضية فقط طلبات CFM / CFC، يمكنك القيام به في بداية التطبيق.cfc شيء مثل هذا:

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

بالنسبة للملفات الأخرى باستخدام تكوين خادم الويب هو الطريقة الوحيدة التي يمكنني رؤيتها. ولكن بدلا من إنشاء قواعد إعادة كتابة القواعد، يمكنك محاولة استخدام Custom 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

إذا كنت تقوم بذلك من أجل عناوين URL SES، فسأقدم قطعتين نصيحة.

الأول هو أنه يهم أقل وأقل مع مرور الوقت. يتعرف Google، على سبيل المثال، أن عناوين URL تحتاج إلى تضمين بيانات الاستعلام.

ثانيا: CF يمكن أن يتعامل مع عناوين URL الخاصة ب SES في اسم المضيف / file.cfm / param1 / param2. راي كامدن blogcfc., على سبيل المثال، يعمل بهذه الطريقة. عند الاستقرار في CF8، ولكن يجب تمكينه في CF7. ليس لدي الكثير من المعلومات مفيدة في هذا، ولكن يجب أن يكون من السهل جوجل (أو Bing، أو أيا كان).

إذا كنت تستطيع السماح بذلك، فسأحاول تحويل عناوين 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 الأساليب، ولكن حتى لك.

بالتأكيد سأذهب لإعادة كتابة URL. لن يكون هناك نهج أكثر قابلية للتنبؤ أكثر قابلية يمكن التنبؤ بها، لكنه يقلل من كمية كبيرة من تحميل الحمل من STRES من خادم CF. علاوة على ذلك، فإنه ينتج عنه CF معالجة طلب إلى ملف حقيقي مما يحقق لك فائدة OnapplicationStart، OnRequestStart، وغيرها من الأحداث.

جانبا، لقد وجدت شخصيا دائما عناوين URL مثل /index.cfm/foo/bar/ لتبدو هرقة ولا تتبع. بالإضافة إلى ذلك، فإن عناوين URL (مثل / FOO / BAR) التي لا تنتهي إما تمديد الملفات أو القطع الخطرة الزائدة غير صحيحة تقنيا (لكل اتفاقيات موقع ثابت في المدرسة القديمة على الأقل) وربما يجب تجنبها أيضا. سأكون أيضا فضوليا حيث يحصل بن عذبة على تأكيده بأن "الأول هو أنهم يهمهم أقل وأقل مع مرور الوقت. جوجل، على سبيل المثال، تدرك أن عناوين URL تحتاج إلى تضمين بيانات الاستعلام." في تجربتي، وجدت في الواقع العكس الصحيح ليكون صحيحا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top