هناك عدة طرق غير مكلفة لاستضافة موقع ويب ثابت تم إنشاؤه باستخدام مولد موقع ثابت مثل Jekyll أو Hugo أو Pelican: تم إنشاء هذه المدونة بالكامل بشكل ثابت باستخدام Jekyll. ومع ذلك ، لا يمكنني استخدام أي من الخيارات المذكورة أعلاه ، لأنه على مدار عمر هذه المدونة ، قمت بتغيير أسماء النطاقات ، وتغيير أنظمة URL ، وإعادة تسمية المنشورات ، وأريد ابق على قيد الحياة جميع عناوين URL القديمة لقد كنت أستضيف هذه المدونة باستخدام Apache ، ومؤخراً ، nginx على جهاز افتراضي واحد ، وتعمل ميزات إعادة التوجيه لأي جزء من البرنامج بشكل جيد ، لكنني كنت مستعدًا لاستضافتها في مكان جديد ومختلف يصف المنشور السابق كيفية إعادة توجيه عناوين URL من نطاق قديم إلى مجال جديد باستخدام Google App Engine و Python ، لكنني الآن بحاجة إلى طريقة لتقديم محتوى ثابت ** و ** إعادة توجيه عناوين URL من نفس المجال. متطلب إعادة توجيه النطاق نفسه هو السبب في أنه لا يمكنني ببساطة استخدام ميزة المحتوى الثابت فقط لـ Google App Engineà  ¢ à  à à (المرتبطة في القائمة أعلاه). ومع ذلك ، يمكنني استخدام Google App Engine مع تطبيق Golang البسيط لخدمة كل من المحتوى الثابت ** و ** عمليات إعادة توجيه النطاق نفسها ## لماذا Google App Engine؟ قبل التعمق في بقية المنشور ، ربما تتساءل ، لماذا تستضيف مدونة على Google App Engine؟ فيما يلي أسبابي لماذا: - إذا كانت حركة المرور الخاصة بك تتلاءم مع الطبقة المجانية لـ App Engineà  ¢ à  à ¢ à  à  ساعة مثيل و 1 غيغابايت من حركة مرور الخروج يوميًا ، فإن استضافة المدونة تكون مجانية عمليًا - يتم دفع التحديثات بأمر واحد - تم دمج التسجيل والمراقبة باستخدام Stackdriver - التحجيم التلقائي لأعلى ولأسفل بناءً على أنماط حركة المرور - ببضع نقرات ، يمكن بسهولة دفع سجلات الويب إلى شيء مثل BigQuery للتخزين طويل الأجل والتحليل المخصص - شهادات SSL المُدارة باستخدام Letà  ¢ à  à  s Encrypt ## المتطلبات الأساسية يفترض هذا المنشور ما يلي: - أنت على دراية بـ Google Cloud Platform (GCP) وأنشأت بالفعل مشروع GCP - لقد قمت بتثبيت Google Cloud SDK - لقد قمت بمصادقة ملف أمر gcloud ضد حساب Google الخاص بك أنشئ مشروع GCP إذا لم تقم بإنشاء ملف ** مشروع GCP اتبع الخطوات التالية: - افتح مستعرض ويب ، وأنشئ حساب Google أو سجّل الدخول إليه - انتقل إلى وحدة تحكم GCP - إذا كان هذا هو أول مشروع GCP لك ، فستتم مطالبتك بإنشاء مشروع GCP. يحصل كل حساب على Google على رصيد بقيمة 300 دولار أمريكي لاستخدامه في غضون 12 شهرًا في برنامج "شركاء Google المعتمدون". أنت مطالب بإدخال بطاقة ائتمان لإنشاء مشروع GCP ، ولكن لن يتم تحصيل الرسوم منه حتى يتم استهلاك رصيد 300 دولار أو انتهاء صلاحية 12 شهرًا - إذا كان هذا مشروع GCP جديدًا ، فستحتاج إلى تمكين Compute Engine API من خلال الانتقال إلى قسم Compute Engine في وحدة تحكم GCP وانتظار اكتمال التهيئة قم بتثبيت Google Cloud SDK إذا لم تقم بتثبيت برنامج ** Google Cloud SDK اتبع التعليمات هنا مصادقة gcloud بمجرد إنشاء مشروع GCP وتثبيت Google Cloud SDK ، فإن الخطوة الأخيرة هي مصادقة ملف أمر gcloud إلى حساب Google الخاص بك. افتح تطبيقك الطرفي وقم بتشغيل الأمر التالي: تسجيل الدخول للمصادقة على gcloud سيتم فتح صفحة ويب في متصفح الويب الخاص بك. حدد حسابك على Google وامنحه إذنًا للوصول إلى برنامج "شركاء Google المعتمدون". بمجرد الانتهاء ، ستتم المصادقة عليك وستكون جاهزًا للمضي قدمًا ## إنشاء دليل بعد ذلك ، قم بإنشاء دليل في مكان ما على محطة العمل الخاصة بك لتخزين تطبيق Google App Engine الخاص بك: mkdir ~ / Sites / example.com / app_engine غيّر إلى هذا الدليل: cd ~ / Sites / example.com / app_engine سيفترض ما تبقى من هذا المنشور أنك تعمل داخل هذا الدليل بالإضافة إلى ذلك ، قم بإنشاء دليل داخل ملف ** app_engine ** دليل يسمى ** ثابت mkdir ~ / Sites / example.com / app_engine / static سوف تعيد زيارة هذا الدليل لاحقًا ## إنشاء التطبيق. yaml يتطلب محرك تطبيقات Google عادةً ملفين: ** app.yaml ** و ** ملف تطبيق ** مكتوب بلغة Python أو Golang أو Java أو PHP - في هذه الحالة سيكون Golang. يوفر ** app.yaml ** التكوين اللازم لتشغيل التطبيق الخاص بك. هناك الكثير من المعلمات المختلفة التي يمكن أن توجد في ** app.yaml قد تختلف هذه المعلمات بناءً على لغة البرمجة المستخدمة. بالنسبة لهذا المنشور ، سيتم استخدام Golang ، ويمكنك العثور على جميع معلمات Golang المتاحة هنا إنشاء ملف ** app.yaml ** بالمحتويات التالية: وقت التشغيل: go api_version: go1 handlers: - url: script: _go_app secure: always redirect_http_response_code: 301 لاحظ أن ** آمن: دائمًا ** تم ضبطه. هذا يعني أن تطبيق Golang سيتم تقديمه دائمًا عبر HTTPS. إذا انتقل أحد المستخدمين إلى تطبيق الويب عبر HTTP ، فسيتم افتراضيًا إعادة توجيه 302 إلى إصدار HTTPS. هذا هو سبب تعيين ** redirect_http_response_code: 301 ** أيضًا. أرغب دائمًا في تقديم تطبيق الويب عبر HTTPS ، ولا أريد أن تفسر محركات البحث إعادة التوجيه من HTTP إلى HTTPS كإعادة توجيه مؤقتة ؛ إنها إعادة توجيه دائمة إذا كان لديك أصول ثابتة ، وربما تفعل ذلك ، فمن الأفضل إبلاغ App Engine بهذا الأمر والسماح له بخدمة هذه الأصول من تخزين الكائن بدلاً من تطبيقك. يعد القيام بذلك أمرًا سهلاً ويتم أيضًا من خلال ملف ** ملف app.yaml ** على سبيل المثال ، إذا كان لديك ملف الأيقونة المفضلة ودليل CSS ودليل Javascript ودليل الصور ، فاستخدم ما يلي ** ملف app.yaml **: وقت التشغيل: go api_version: go1 handlers: - url: /favicon.png$ static_files: static / favicon.png upload: static / favicon.png - url: / css static_dir: static / css - url: / js static_dir: static / js - url: / images static_dir: static / images - url: script: _go_app secure: redirect_http_response_code: 301 ## إنشاء main.go بعد ذلك ، تحتاج إلى ملف تطبيق Golang للحصول على التعليمات البرمجية التالية لتلبية احتياجاتك ، قم بإنشاء ملف ** main.go انسخ والصق الكود أدناه ، وقم بإجراء التعديلات التالية: - في ال domainvariable ، قم بتغيير القيمة لمطابقة اسم المجال الخاص بك مع بروتوكول HTTP الصحيح - في ال urlsmap ، استبدل جميع أزواج القيم الرئيسية لمطابقة عمليات إعادة التوجيه التي تحتاجها في مكانها. استبدل كل مفتاح بجزء المسار فقط (/example-post-1.htmlinstead من httpsexample.com/example-post-1.html) للمجال الحالي  ¢ ¢ à  à  عنوان URL القديم الذي تريده حافظ على حياتك. ثم استبدل كل قيمة بجزء المسار من المجال الحالي URL الجديد الذي تريد إعادة التوجيه إليه ستكون جميع عمليات إعادة التوجيه 301 عمليات إعادة توجيه. يمكن تعديل هذا عن طريق التغيير ** 301 ** في الكود أدناه إلى رمز حالة إعادة توجيه HTTP مختلف مثل ** 302 ** استيراد الحزمة الرئيسية ("net / http""os""strings") func init () {http.HandleFunc handler)} معالج func (w http.ResponseWriter، r * http.Request) {// True (ok) عند الطلب المسار موجود في خريطة عناوين url إذا كانت القيمة ، حسنًا: = urls [r.URL.Path] ؛ حسنًا {القيمة = المجال + القيمة http.Redirect (w، r، value، 301)} else {path: = "static /"+ r.URL.Path // إرجاع 403 إذا كان طلب HTTP إلى دليل موجود ولا يوجد لا تحتوي على ملف index.html إذا كان f ، err: = os.Stat (مسار) ؛ err == nil&& f.IsDir () {index: = strings.TrimSuffix (path، + "/index.html"if _، err: = os.Open (index)؛ err! = nil {w.WriteHeader (403) w.Writebytehtml> 403 Forbidden

403 Forbidden

return } } // Return custom 404 page if HTTP request is to a non-existent file if _, err := os.Stat(path); os.IsNotExist(err) { w.WriteHeader(404) http.ServeFile(w, r, "static/404.html") return // Withoutreturn, a "404 page not found" string will be displayed at the bottom of your custom 404 page } http.ServeFile(w, r, path) return } } var domain string = "httpsexample.com" var urls = map[string]string{ "/example-post-1.html": "/post/example-post-1.html", "/example-post-2.html": "/post/example-post-2.html", "/example-post-3.html": "/post/example-post-3.html", } ## Generate the Static Content With **app.yaml** and **main.go** saved, the last piece is to generate your static content and store it in the **static** directory you created earlier How you do this entirely depends on what static site generator you are using If you are using Jekyll, you can configure the **destination** parameter in Jekyll’s _ **config.yml** file to save your static content in any directory on your workstation. So, you could set the **destination** parameter to Sites/example.com/app_engine/static and, every time you run jekyll build, the static content will be saved in that directory ## Deploy to App Engine With **app.yaml **main.go and your static content generated, you are ready to deploy your Google App Engine application Assuming gcloud is already pointed at the Google Cloud Project you want to deploy to, verify with gcloud config list project, run the following command: gcloud app deploy The command will output the appspot URL your application will be deployed to and ask if you want to continue. Typically, the appspot URL is **httpsyour-project-id.appspot.com This is also a useful self-check to make sure you are not deploying your application to the wrong Google Cloud Project. If everything looks okay, type **Y** and **Enter** to deploy your application. Depending on how large your static content is, your application should be deployed within about one minute ## Setup DNS At this point, your application is deployed under URL **httpsyour-project-id.appspot.com Unless your website uses that as its domain name, you will probably want to setup a custom domain that uses your actual current domain name The App Engine section of the Google Cloud Console can be used to do this. Go here and follow the instructions to configure your custom domain Once that is complete and DNS has had time to propagate, you should be able to navigate in your web browser to one of your current domain’s old URLs, for example **httpsexample.com/example-post-1.html and have it redirect to your current domain’s new URLs, for example **httpsexample.com/post/example-post-1.html** ## Pushing Updates To push updates, make the necessary changes in your static site’s source directory, regenerate the static content, and redeploy to Google App Engine by changing into the Sites/example.com/app_engine** directory and running gcloud app deploy ## References - A Surprising Feature of Golang that Colored Me Impressed - How to check if a map contains a key in go? - Disable directory listing with http.FileServer - 3 Ways to Disable http.FileServer Directory Listings - Handling HTTP Request Errors in GO - HTTP and Error management in Go - please add ability to set custom 404 notFoundHandler for http.FileServer