داستان چیه

مطلبی که داریم در موردش صحبت میکنیم چیزی نیست که در حالت عادی به ذهن شما برسه. اینکه اصلا از Underscore در هدرها استفاده کنیم آیا به مشکل بر میخوریم یا نه. بیاید مسئله رو بررسی کنیم.

فرض کنید شما نیاز به تنظیم یک هدر جهت ثبت توکن اعتبارسنجی دارید. با دو روش میشه این کار رو انجام داد:

curl --HEADER "AUTH_TOKEN: 1234" example.com
curl --HEADER "AUTH-TOKEN: 1234" example.com

به احتمال زیاد هردوی این هدر ها برای شما کار مورد نظر رو انجام میدن و مشکل خاصی پیش نمیاد اما اگه از روش اول استفاده کنید و برید سراغ سرویس هایی مثل AWS Elastic Beanstalk متوجه خواهید شد که یه جای کار لنگ میزنه و هدر شما اصلا دیده نمیشه !! به این خروجی نگاه کنید:

{
  "headers": {
    "connection": "upgrade",
    "host": "app-example-aws.example.com",
    "x-real-ip": "172.31.xxx.xxx",
    "x-forwarded-for": "54.157.xxx.xxx, 172.31.xxx.xxx",
    "x-forwarded-proto": "https",
    "x-forwarded-port": "443",
    "x-amzn-trace-id": "Root=1-60517ca4-xxxxx",
    "accept": "application/json",
    "content-type": "application/json",
    "cookie": "grouparooSessionId=xxxxxxxxxx",
    "user-agent": "axios/0.21.1"
  }
}

مشاهده میکنید که هدر AUTH_TOKEN حذف شده. مشکل اینجاست که Elastic Beanstalk اپلیکیشن ها رو توسط Nginx به عنوان یه reverse-proxy مدیریت میکنه. اتفاقی که سمت Nginx میوفته یکم نیاز به مطالعه داره.

در حالت عادی Nginx هدر هایی که Underscore داره رو به عنوان متغیر های CGI در نظر میگیره و پس از اجرا به صورت خودکار تمام این هدر ها رو از لیست کلی حذف میکنه. اینجا رو چک کنید

حل مشکل

قبل از اینکه ادامه بدیم به این نکته توجه کنید که استفاده از Underscore طبق مستندات HTTP هیچ مشکلی نداره و کاملا معتبره. مشکلی که اینجا باهاش سر و کار داریم فقط مربوط به Nginx هست.

تنظیم Nginx

خوشبختانه Nginx این مشکل رو در نظر گرفته و جهت رفع اون یک متغیر در اختیار شما گذاشته. این متغیر به اسم underscores_in_headers موجوده و میتونید از طریق فایل nginx.conf اون رو تنظیم کنید.

underscores_in_headers on;

تغییر هدر ها!

شاید ساده ترین راه تعریف کردن یه قانون کوچیک برای خودمون باشه ٬ اینکه هیچوقت توی هدر هامون از Underscore / Underline استفاده نکنیم. در این صورت مطمئن میشیم که هیچ مشکلی پیش نمیاد.

توجه داشته باشید که ممکنه شما همیشه به کانفیگ Nginx دسترسی نداشته باشید. مثل سناریویی که در بالا براتون شرح دادم. پس خیلی بهتره که مشکل رو از سمت خودمون حل کنیم. هم ساده تره هم سریع تر 😃