برنامه نویسی

تغییر مسیر www برای ریشه در AWS RT53

باور نکن ، فقط تایپ کن is www an anachronism در جستجوی گوگل به احتمال زیاد پاسخ مشابه موارد زیر را دریافت خواهید کرد:

شرح تصویر

من به تازگی دامنه های خود را از Godaddy به RT53 مهاجرت کردم و این روند به همان اندازه که امیدوار بود مستقیم نبود.
مسیر 53 گزینه های گسترده ای را برای مراجعه به منابع AWS در سطح دامنه ارائه می دهد ، امکان ادغام بهتر و تلاش را ارزشمند می کند.

بیشتر ثبت های دامنه (مانند GoDaddy) رابط کاربری مناسب را برای اجازه دادن به مشتریان برای ارسال دامنه ها ارائه می دهند. هیچ استاندارد W3C وجود ندارد که نحوه اجرای ارائه دهندگان رجیستری DNS را برای حمل و نقل دامنه تنظیم کند. بنابراین کاملاً به ارائه دهندگان فردی بستگی دارد که چگونه می توانند حمل و نقل را اجرا کنند.

بر خلاف بسیاری از ارائه دهندگان ثبت دامنه ، RT53 گزینه حمل و نقل دامنه را از جعبه ارائه نمی دهد. اگر مستندات را بخوانید ، به شما می گوید که تعریف رکورد CNAME در RT53 تمام کاری است که باید انجام دهید. خوب ، این فقط به این روش کار نمی کند (بر اساس تجربه من ، اگر اشتباه می کنم ، احساس راحتی کنید در نظرات ارسال کنید – همیشه به دنبال یادگیری چیز جدید هستید). تنها راهی که من می توانم آن را کار کنم ، اضافه کردن عملکرد ساده لبه بود که تمام درخواست ها را به برنامه وب من رهگیری می کند و پاسخ 301 (به طور دائم) را به صورت برنامه ای برمی گرداند.

فقط برای اثبات نظر من ، اینجاست CNAME رکورد من در منطقه میزبان خود برای https://wwww.wisaw.com دارم

شرح تصویر

و اگر روی پیوند بالا کلیک کنید ، به هیچ چیز برطرف نمی شود.
بیایید ببینیم ساده ترین راه برای اجرای راه حل جایگزین چیست.

در پشته CDK خود ، عملکرد لبه را مانند این تعریف کنید:


      const redirectLambdaEdgeFunction =
        // new lambda.Function( // trying to define it as an Lambda@Edge function
        new cloudfront.experimental.EdgeFunction(
          this,
          `${deployEnv()}_redirectLambdaEdgeFunction`,
          {
            runtime: lambda.Runtime.NODEJS_22_X,
            code: lambda.Code.fromAsset(
              path.join(
                __dirname,
                "../lambda-fns/lambdas/redirectLambdaEdgeFunction",
              ),
            ),
            // code: lambda.Code.fromAsset('lambda-fns/lambdas.zip'),
            handler: "index.handler",
            memorySize: 128,
            timeout: cdk.Duration.seconds(5),
            // insightsVersion,
            logRetention,
          },
        )
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

با فرض اینکه شما میزبان برنامه تک صفحه خود هستید S3 سطل با CloudFront distro (نحوه انجام این کار را در اینجا بخوانید: https://dev.to/dmitryame/serving-static-content-from-s3-bucket-195p) ، اضافه کنید edgeLambdas بخش به defaultBehavior از شما CloudFront distribution مثل این:

      // Create the CloudFront distribution with S3 as an origin
      const distribution = new cloudfront.Distribution(this, "wisaw-distro", {
        priceClass: cloudfront.PriceClass.PRICE_CLASS_100,
        defaultBehavior: {
          origin: cloudfront_origins.S3BucketOrigin.withOriginAccessControl(webAppBucket),
          compress: true,
          cachePolicy: basicCachePolicy,
          originRequestPolicy: allForwardPolicy,
          viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, // Add this line
          edgeLambdas: [
            {
              eventType: cloudfront.LambdaEdgeEventType.VIEWER_REQUEST,
              functionVersion: redirectLambdaEdgeFunction.currentVersion,
              includeBody: true,
            },
          ],
        },
...
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و اینجا است Edge اجرای عملکرد:

exports.handler = async (event) => {
  const request = event.Records[0].cf.request;

  // CloudFront headers are in format: { "host": [{"key": "Host", "value": "www.wisaw.com"}] }
  const host = request.headers.host && request.headers.host[0].value;

  if (host === 'www.wisaw.com') {
    // Build the new URL, preserving query string if present
    let redirectUrl = `https://wisaw.com${request.uri}`;
    if (request.querystring) {
      redirectUrl += `?${request.querystring}`;
    }

    return {
      status: '301',
      statusDescription: 'Moved Permanently',
      headers: {
        location: [{
          key: 'Location',
          value: redirectUrl
        }]
      }
    };
  }

  return request;
};
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این بسیار مستقیم به جلو و خود توضیحی است.

  1. همه درخواست ها را رهگیری کنید
  2. اگر میزبان درخواست شده مطابقت داشته باشد www.wisaw.com – پاسخ را با تغییر مسیر که پیشوند را نوار می کند آماده کنید wwwوت
  3. این پاسخ را با وضعیت برگردانید 301

پس از مجدداً پشته CDK خود – همه چیز فقط کار خواهد کرد.

فقط برای کامل کردن امور ، شما همچنین می خواهید همه خود را مطمئن کنید http درخواست تغییر مسیر به httpsبشر اگر شما درخواست کنید ، عملکرد لامبدا این کار را برای شما انجام می دهد www زیر دامنه اما اگر به http://wisaw.com ضربه بزنید ، چه می کنید؟ در CloudFront تعریف شما CDK پشته ، یک خط کد وجود دارد که این رفتار را تعریف می کند:

          viewerProtocolPolicy: cloudfront.ViewerProtocolPolicy.REDIRECT_TO_HTTPS, // Add this line

حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

و این همه است. با تشکر از خواندن

کد کامل این پست را می توان در اینجا یافت: https://github.com/echowaves/wisaw.cdk
برنامه وب میزبان S3 با استفاده از تغییر مسیر به درستی تعریف شده https://wisaw.com است

هک شدن مبارک

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا