سؤال

مرحبا، أحاول إعادة توجيه جميع الروابط إلى أي ملف PDF في موقعي إلى صفحة مع نموذج يجمع معلومات المستخدم قبل أن تتمكن من المتابعة لتنزيل / عرض PDF.

على سبيل المثال

أريد إعادة توجيه ملفات * .pdf في موقع الويب لطلب المزيد من الملفات؟

حيث price.php هو الصفحة ذات النموذج الموجود عليه طلب تفاصيل قليلة قبل المتابعة.

يتم عقد جميع ملفات PDF في الموقع داخل / مجلد PDF.

أيه أفكار؟

تحرير: آسف أنا أستخدم Apache على الخادم.

حسنا، أنا أتوصل إلى هناك: لدي تعمل الآن باستخدام:

rewriteEngine على إعادة الترتيب ^ PDF /(.+. PDF) $ طلب report.php؟ ملف = / $ 1 [ص

ولكن الآن عندما تذهب إلى صفحة التنزيل عندما أرغب في السماح للشخص بتنزيل الملف بالفعل، فإن القاعدة الجديدة هي ببصق رابط التنزيل مرة أخرى إلى النموذج :-P HHA SO هناك على أي حال للسماح له بالتنزيل مرة واحدة تم إرسالها وأنت على التحميل.

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

المحلول

يمكنك تجربة هذا:

  • حرك ملفاتك إلى مجلد "خارج" جذر الويب الخاص بك حتى لا يمكن لأحد الوصول إلى ذلك من خلال المتصفح
  • استخدم جلسات الكشف عن ما إذا كان الشخص قد أكمل النموذج أم لا
  • استخدم برنامج تنزيل ملف PHP التشغيل. في شكل Naivest، قد يبدو هذا:
 إذا (isset (_set (_session $ ['ok_to_download']) == false) {header ("الموقع: must_fill_first.php")؛ الخروج (0)؛ } رأس ("نوع المحتوى: التطبيق / PDF")؛ // مضاعفة تحقق من أعلاه، جوجل كأنني لست متأكدا من eco file_get_contents ('some_directory_inaccessable_thru_www /'. $ _get ['pdf_name'])؛ // من الناحية المثالية تحتاج وظيفة آمنة ثنائية إلى استخدامها أعلاه

هذه هي تقنية مجربة ومختبرة استخدمت على موقع ويب. مثال الكود هو مشروع مخطط تفصيلي وتحتاج إلى تحسين.

نصائح أخرى

الأفكار؟ يمكنك البدء بإخبارنا بخادم الويب / تطبيقات الويب التي تستخدمها، والتي قد تساعد :-)

في Apache، يجب أن تكون قادرا على استخدام إعادة توجيه لإعادة توجيه الطلب إلى نموذج مختلف. على سبيل المثال، تحول /pub/docs/x.pdf إلى request.php?file=/pub/docs/x.pdf يمكن القيام به مع شيء مثل:

RewriteRule ^/pdf/(.*)\.pdf/  request.php?file=/$1.pdf

ضع في اعتبارك أن هذا من الذاكرة (ست سنوات منذ أن لمست Apache ولا يزال نظيفا :-)، قد يكون التنسيق مختلفا قليلا.

تحديث:

الآن قد حصلت على الفرز، إليك بعض الخيارات لمشكلتك التالية.

1 / إعادة تسمية ملفات PDF للحصول على ملحق مختلف بحيث لا يتم القبض عليه بواسطة قاعدة إعادة الكتابة. يجب تكوينها لدفع نفس نوع MIME إلى العميل بحيث يفتحون في اختيار العملاء من المشاهد.

2 / قم بتنزيل التنزيل كجزء من البرنامج النصي كذلك، وليس كوصول مباشر إلى PDF. نظرا لأن تقديم النموذج هو طلب HTTP، يجب أن تكون قادرا على الإجابة عليه على الفور بمحتويات PDF بدلا من إعادة توجيهها تكرارا إلى صفحة التنزيل.

الخيار الثاني سيكون خياري لأنه:

  • توقف عن توقف الأشخاص الذين يمكنهم الوصول إلى ملفات PDF فقط عن طريق طلب xx.pdfx بدلا من xx.pdf.
  • يجعلها أسرع للشخص للحصول على PDF (لا يتعين عليهم النقر فوق الارتباط مرة أخرى).

ملاحظة، إجابتي فيما يتعلق بموقع .NET، لكنني متأكد من أن نفس البنيات موجودة في مكان ما في PHP.

سيكون لدي httpmodule مع مسار * .pdf الذي ببساطة يقوم ببساطة بالرد. ... إلخ (في طلب الحالة الخاص بي.aspx) ثم في معالج الأحداث للزر النقر على تلك الصفحة، عندما تعرف أن قوات الدفاع الشعبي لعرضها وأنها مخولة، بسيطة تقوم بالرد. ConstentType = [نوع MIME من PDF]، ثم Response.writeFile (PDFFILE)، وأخيرا Response.end ().

هناك أشياء أخرى يمكنك إضافتها لجعلها أفضل، مثل FileSize، وما إلى ذلك ولكن في الحالة الحد الأدنى، سيعمل ذلك. إذا كنت تريد الرمز الخاص به في C #، فقد أتيت مع شيء ما في حوالي 3 دقائق، ولكن في PHP، فقد فقدت تماما. سأبدأ البحث عن httpmodules وكيفية كتابةها في PHP.

googling ل "php httpmodule" يؤدي إلى هذا: ما يعادل أجهزة HttpModules ASP.NET في PHP لذلك، قد أكون خاطئا بعض الشيء، ولكن نأمل أن تكون نقطة انطلاق.

استخدم ملف .htaccess إذا كنت تستخدم خادم ويب Apache. ستحتاج إلى التأكد من تمكين MOD_REWRITE، ولكن بمجرد قيامك بإعادة كتابة جميع الملفات باستخدام هذه الخطوط البسيطة:

rewriteEngine على إعادة الترتيب ^ .pdf $ /rewrite.php [NC، L

إذا كنت تستخدم IIS، فيمكنك إنجاز شيء مشابه باستخدام ISAPI_REWRITE.

بديل الخاص بك هو وضع ملفات PDF الخاصة بك داخل دليل غير قابل للوصول علنا، ثم إرجاع أي طلب مصنوع لمورد PDF خطأ تم رفض الوصول ولا يمكن الوصول إلى الملفات إلا من خلال البرنامج النصي المناسب.

if($user==authenticated){
 //set pdf headers
 echo file_get_contents('actual.pdf');

لا إعادة تكوين وزارة الدفاع، يخفي المصدر الفعلي وهو ما أفعله عادة - آمل أن يكون هذا يساعد

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