Skip to content

مختبر nginx location — لماذا تفوز هذه الكتلة

اعرف أي كتلة location يختارها nginx — ولماذا خسرت كل كتلة أخرى. مختبر مجاني لمطابقة =, ^~, ~ و~* يعمل بالكامل داخل متصفحك بلا رفع أي شيء.

بدون تتبّع يعمل في المتصفّح مجاني
يُحلَّل إعدادك محلياً داخل متصفحك ولا يُرفع أبداً. ملفات إعداد الخوادم تحمل أسماء مضيفات المنبع وكتل المصادقة، فافتح لوحة الشبكة وراقبها وهي صامتة — أو اقطع الاتصال بالكامل.
جرّب خطأ إعداد حقيقياً
الكتلة المختارة
~* \.(gif|jpg|jpeg)$

أول تعبير نمطي طابق بترتيب الإعداد. الطول لا يهمّ.

ما الذي يطابقه nginx فعلاً
هدف الطلب
/documents/1.jpg
$uri بعد التطبيع
/documents/1.jpg
سلسلة الاستعلام $args

تجري المطابقة على المسار بعد التطبيع وحده. سلسلة الاستعلام تُفصل أولاً ولا تشارك إطلاقاً.

لماذا فازت تلك الكتلة
لماذا فازت تلك الكتلة
السطر location المرحلة النتيجة السبب
2 = / تطابق تام لا تطابق كتلة = تتطلب تساوي المسار بالكامل، لا أن يبدأ به.
3 / البادئة طابقت لكنها أقصر تطابق، لكن بادئة أخرى طابقت حروفاً أكثر.
4 /documents/ البادئة طابقت لكنها أقصر تطابق، لكن بادئة أخرى طابقت حروفاً أكثر.
5 ^~ /images/ البادئة لا تطابق المسار لا يبدأ بهذه البادئة.
6 ~* \.(gif|jpg|jpeg)$ تعبير نمطي مختارة أول تعبير نمطي طابق بترتيب الإعداد. الطول لا يهمّ.

مُعدِّلات location في nginx: مقارنة =, ^~, ~, ~*

مُعدِّلات location في nginx: مقارنة =, ^~, ~, ~*
المُعدِّل الصياغة يطابق بـ الترتيب يوقف التعابير الاستخدام المعتاد
= location = /path تساوٍ 1 نعم المسارات كثيرة الطلب مثل / — أسرع تطابق ممكن.
^~ location ^~ /path يبدأ بـ 2 نعم المجلدات التي يجب ألّا تُسلَّم لتعبير نمطي، مثل مجلدات الرفع.
~ location ~ regex تعبير نمطي 3 لا التوجيه حسب الامتداد حين تهمّ حالة الأحرف.
~* location ~* regex تعبير نمطي 3 لا التوجيه حسب الامتداد حين لا تهمّ حالة الأحرف.
(بدون) location /path يبدأ بـ 4 لا التوجيه العام حسب المسار.
@ location @name داخلي فقط لا احتياطات error_page و try_files.

عمود الترتيب ليس تصنيفاً بسيطاً. لا توقف كتلة البادئة تقييم التعابير النمطية إلا حين تحمل ^~ وتكون هي نفسها أطول تطابق — ولهذا تحديداً تبدو كتلة ^~ أحياناً بلا أي أثر.

أولوية location في nginx: ترتيب الحسم

أولوية location في nginx: ترتيب الحسم
# المرحلة تنهي البحث ما الذي يحدث
1 التطبيع لا فكّ ترميز النسبة المئوية، وحلّ . و.. ، ودمج الشرطات المتكررة. سلسلة الاستعلام تُفصل هنا ولا تشارك في المطابقة إطلاقاً.
2 تطابق تام نعم location = /path، تُقارن بالتساوي. التطابق ينهي البحث فوراً.
3 توجيه تلقائي نعم كتلة وساطة اسمها هو المسار زائد شرطة مائلة. يردّ nginx بـ 301 ولا يصل إلى التعابير النمطية.
4 البادئة لا تُقارن كل بادئة مطابقة وتُحفظ الأطول. ترتيب الإعداد مُهمَل.
5 متداخلة لا يُنزَل إلى داخل البادئة الفائزة. التعبير النمطي المتداخل يُجرَّب قبل مستوى الأب.
6 تعبير نمطي نعم تُجرَّب التعابير النمطية بترتيب الإعداد وأول تطابق يفوز. التعبير الأطول أو الأدقّ المكتوب لاحقاً لا يُنفَّذ أبداً.
7 احتياطي نعم لم يطابق أي تعبير نمطي، فتُستخدم البادئة المحفوظة سابقاً.
ترتيب المطابقة، وقطع ^~ لمرحلة التعابير النمطية، والنزول إلى الكتل المتداخلة، وسلوك إعادة التوجيه التلقائية، وتطبيع المسار — كلها فُحصت مقابل مصدر nginx نفسه وأُكِّدت بتشغيل الإعدادات على nginx 1.27.5فريق هندسة Go Tools · Jul 22, 2026

قواعد الاختيار في هذه الصفحة جرى التحقق منها مقابل nginx 1.27.5 قيد التشغيل لا نقلاً عن كتابات ثانوية، والمحرك مغطّى باختبارات وحدة مشتقّة من تلك التشغيلات.

مطابقة <bdi>location</bdi> في <bdi>nginx</bdi>: إجابات سريعة

هل يعالج <bdi>nginx</bdi> كتل التعابير النمطية قبل البادئات؟

لا — تُفحص البادئات أولاً، لكن تعبيراً نمطياً مطابقاً يفوز رغم ذلك. يفحص nginx كل كتل البادئة أولاً ويحفظ أطول تطابق، ثم يقيّم كتل التعابير النمطية بالترتيب الذي تظهر به في الملف. أول تعبير مطابق يفوز. وإن لم يطابق أي تعبير، تُستخدم البادئة المحفوظة. الاستثناء الوحيد هو ^~: حين تحمله أطول بادئة مطابقة، تُتخطّى مرحلة التعابير النمطية بالكامل.

هل يهمّ ترتيب كتل <bdi>location</bdi> في <bdi>nginx</bdi>؟

لكتل التعابير النمطية فقط. كتل البادئة — بما فيها = و^~ — تُختار بأطول تطابق، فترتيبها في الملف لا وزن له. أما كتل التعابير النمطية فتُجرَّب من الأعلى إلى الأسفل وأول تطابق يفوز، فتحريك كتلة تعبير نمطي يغيّر أيّها يُنفَّذ. والتعبير الأدقّ الموضوع أسفل تعبير أوسع لا يُنفَّذ أبداً.

ما الذي يفعله المُعدِّل <bdi>^~</bdi> فعلاً؟

يوقف البحث بعد تطابق البادئة، ولا يرفع الأولوية. إن حملت أطول بادئة مطابقة ^~، تخطّى nginx مرحلة التعابير النمطية واستخدم تلك الكتلة. لا يجعل ذلك البادئة أطول ولا يرفعها فوق بادئات أخرى — كل ما يفعله هو كبح تقييم التعابير النمطية. ولهذا تبدو كتلة ^~ بلا أثر حين تطابق أيضاً بادئة عادية أطول: الأطول هي المحفوظة، وهي لا تكبح شيئاً.

هل <bdi>location /static</bdi> مثل <bdi>location /static/</bdi>؟

لا — <bdi>/static</bdi> يطابق <bdi>/staticfoo</bdi> أيضاً. مطابقة البادئة مقارنة نصية بسيطة لا حدود لها عند مقاطع المسار، فتخدم location /static كذلك /staticfiles و/static-backup. وبشكل منفصل، حين تُستخدم /static/ مع proxy_pass، يتلقّى الطلب على /static بلا شرطة مائلة إعادة توجيه 301 إلى /static/ قبل النظر في أي تعبير نمطي.

هل يفكّ <bdi>nginx</bdi> ترميز <bdi>%2F</bdi> ويدمج الشرطات المزدوجة قبل المطابقة؟

نعم — المطابقة تجري على المسار بعد التطبيع لا على الطلب الخام. يفكّ nginx ترميز %XX، ويحلّ . و..، ويضغط الشرطات المتكررة قبل اختيار أي كتلة. و%2F بعد فكّ ترميزه يصير فاصلاً حقيقياً ويشارك في ذلك الحل، فيُطابَق /a/b%2F..%2Fzz بوصفه /a/zz. أما سلسلة الاستعلام فتُفصل أولاً ولا تشارك في المطابقة إطلاقاً.

ما كتلة location في nginx؟

كتلة location تخبر nginx بما يفعله مع طلب يطابق مساره نمطاً معيّناً. وكتلة server تضم عادة عدة كتل منها، والمثير ليس ما تفعله كل واحدة بل أيّها يختار nginx — لأن قواعد الاختيار ليست ما يفترضه معظم الناس.

هناك خمس صيغ. location = /path تطابق فقط حين يتساوى المسار كاملاً. وlocation /path تطابق أي مسار يبدأ بتلك الحروف. وlocation ^~ /path هي مقارنة البادئة نفسها مع أثر إضافي واحد. وlocation ~ regex وlocation ~* regex تطبّقان نمط PCRE، مع مراعاة حالة الأحرف ودونها. أما location @name فلا تشارك في مطابقة المسار إطلاقاً وتوجد فقط كهدف لـ try_files وerror_page.

يجري الاختيار على مراحل. أولاً يُطبَّع المسار: فكّ ترميز النسبة المئوية، وحلّ . و..، ودمج الشرطات المتكررة، وفصل سلسلة الاستعلام. ثم إن وُجدت كتلة = تساوي المسار انتهى البحث فوراً. ثم تُقارن كل بادئة مطابقة وتُحفظ الأطول — وترتيب الإعداد لا دور له هنا إطلاقاً. فإن حملت البادئة المحفوظة ^~، توقف nginx واستخدمها. وإلا جُرِّبت كتل التعابير النمطية بالترتيب الذي تظهر به في الملف، وأول تطابق يفوز مهما كان تالٍ له أدقّ. وإن لم يطابق أي منها، استُخدمت البادئة المحفوظة.

قاعدتان من هذه القواعد تشدّان في اتجاهين متضادين، وهناك يسكن الالتباس: البادئات تُختار بالطول بصرف النظر عن الترتيب، والتعابير النمطية بالترتيب بصرف النظر عن الطول. إعداد يُقرأ صحيحاً من أوله إلى آخره قد يوجّه طلباً إلى مكان لم تقصده، ولا تكشف ذلك إعادة القراءة مهما تكررت. هذه الصفحة تعيد تشغيل التسلسل كاملاً على إعدادك أنت وتبيّن أين خرجت كل كتلة.

# From the nginx documentation. Which block serves each request?
server {
    location = /                   { }   # A
    location /                     { }   # B
    location /documents/           { }   # C
    location ^~ /images/           { }   # D
    location ~* \.(gif|jpg|jpeg)$  { }   # E
}

#   /                        -> A   exact match, search ends here
#   /index.html              -> B   no regex matched, longest prefix used
#   /documents/document.html -> C   longer prefix than B
#   /images/1.gif            -> D   ^~ won the prefix stage, regex skipped
#   /documents/1.jpg         -> E   regex beats the longer prefix C

# The last two lines are the whole lesson: identical-looking prefixes
# behave differently because only one of them carries ^~.

الميزات الأساسية

كل كتلة خاسرة، ومعها مرحلة إقصائها

كل كتلة location كتبتها تحصل على صف: طابقت لكنها أقصر، أو تُخطّيت لأن بادئة ^~ فازت، أو غير قابلة للوصول لأن تعبيراً أسبق طابق، أو لم تطابق ببساطة. ومعرفة سبب خسارة الأخريات هي ما يحسم السؤال عادةً.

سلسلة القرار بمراحلها الأربع، معادة التشغيل

التطبيع، والتطابق التام، وحفظ أطول بادئة، وقطع ^~ للمرحلة التالية، والتعابير النمطية بترتيب الملف، ثم الاحتياطي — تظهر كخطوات منفصلة على إعدادك أنت بدل وصفها وصفاً مجرّداً.

قطع ^~ مرئياً

حين تكبح بادئة ^~ مرحلة التعابير النمطية، يوسَم كل تعبير مُتخطّى بأنه مُتخطّى بدل أن يختفي بصمت — وحين تفشل ^~ في التطبيق لأن بادئة عادية أطول فازت، يظهر ذلك أيضاً.

الكتل المتداخلة مُحلّلة لا مسطّحة

ينزل nginx إلى داخل البادئة الفائزة ويبحث في أبنائها، فيعمل التعبير النمطي المتداخل قبل تعابير المستوى الأب. والكتل المتداخلة تحتفظ بإزاحتها في الجدول كي تبقى البنية مقروءة.

اكتشاف صياغة PCRE الحصرية مسبقاً

المتصفحات تشغّل تعابير ECMAScript النمطية لا PCRE. المجموعات الذرّية، والمكمّمات الاستحواذية، وأصناف POSIX، وهروب مثل \A و\K تُوسَم بدل تقييمها تقييماً خاطئاً صامتاً، فلا تُقدَّم إجابة واثقة خاطئة على أنها حقيقة.

لا شيء يُرفع — يعمل داخل متصفحك

إعدادات الخوادم تحمل أسماء مضيفات المنبع ومنافذ داخلية وقواعد مصادقة. التحليل عمل نصي بسيط بلا اعتماديات وبلا استدعاءات شبكة، ويتحقق منه اختبار تعاقدي آلي مع كل بناء.

طرق أخرى للإجابة عن هذا السؤال

nginx -T

سطر الأوامر

يُفرغ الإعداد بعد حلّه كاملاً، وهو لا يُقدَّر بثمن لمعرفة ما هو محمَّل فعلاً. لكنه لن يخبرك أي كتلة <bdi>location</bdi> يختارها مسار معيّن — وتلك هي الفجوة التي تملؤها هذه الصفحة.

error_log ... debug

خادم حيّ

الإجابة الأوثق المتاحة: سطر <code><bdi>using configuration</bdi></code> يسمّي الكتلة التي اختارها <bdi>nginx</bdi> حقاً. لكنه يحتاج صلاحية الجذر وإعادة تحميل وخادماً يمكنك بلوغه — فهو يجيب بعد النشر لا قبله.

مدقّقات صياغة الإعداد

خدمة مستضافة

قوية في تدقيق الملف كاملاً وفي قواعد الأمان. لكنها تعمل عموماً على الخادم، ما يعني رفع إعداد يحوي أسماء مضيفات داخلية ومسارات شهادات.

قراءة التوثيق

مرجع

توثيق <bdi>nginx</bdi> يذكر الخوارزمية بدقة ويستحق القراءة مرة. لكن تطبيقها يدوياً على ثماني كتل ومسار واحد هو موضع تسلل الأخطاء، لأن قاعدتين منها تشدّان في اتجاهين متضادين.

أمثلة على مطابقة location في nginx

تعبير نمطي يهزم بادئة أطول

location /documents/  ·  location ~* \.(gif|jpg|jpeg)$  ·  GET /documents/1.jpg
~* \.(gif|jpg|jpeg)$ wins

البادئة /documents/ تطابق وهي أطول بادئة في الملف، فيحفظها nginx — ثم يقيّم التعابير النمطية على أي حال ويسلّم الطلب لأول تعبير يطابق. الطول يخسر أمام مرحلة التعابير النمطية. ولو كُتبت تلك البادئة ^~ /documents/ لما نُفِّذ التعبير النمطي أصلاً. هذا هو المثال الوارد في توثيق nginx، وهو أنفع مثال يستحق أن يترسّخ في الذهن.

مجلد الرفع الذي ينفّذ PHP

location /uploads/  ·  location ~ \.php$ { fastcgi_pass ... }  ·  GET /uploads/evil.php
~ \.php$ wins — the upload lands in the interpreter

البادئة /uploads/ تطابق، لكن البادئة العادية لا توقف مرحلة التعابير النمطية، فيذهب ملف رفعه أحدهم مباشرة إلى PHP-FPM. كتابة location ^~ /uploads/ تقطع مرحلة التعابير النمطية وتغلق الباب. هذه ليست حالة افتراضية: إنها الشكل الكامن خلف سلسلة طويلة من بلاغات «الرفع يقود إلى تنفيذ أوامر عن بُعد»، والفارق بين المكشوف والآمن حرفان.

^~ التي لا تفعل شيئاً في صمت

location ^~ /a/  ·  location /a/b/  ·  location ~ \.php$  ·  GET /a/b/x.php
~ \.php$ wins — the ^~ never applied

^~ لا تكبح مرحلة التعابير النمطية إلا حين تكون هي نفسها أطول بادئة مطابقة. هنا /a/b/ أطول، فهي المحفوظة لدى nginx، ومُعدِّلها العادي يترك مرحلة التعابير النمطية تعمل. كتلة ^~ ما زالت في الملف، وما زالت تبدو واقية، وليس لها أي أثر على هذا الطلب. قراءة الإعداد من أوله إلى آخره لن تكشف ذلك؛ مقارنة أطوال البادئات تكشفه.

/static يلتقط /staticfoo أيضاً

location /static  ·  location /static/  ·  GET /staticfoo
/static wins

مطابقة البادئة تقارن الحروف لا مقاطع المسار. /staticfoo يبدأ بـ /static فهو يطابق، و/static/ لا تطابق إطلاقاً لأن المسار لا يحمل شرطة مائلة في ذلك الموضع. أي شيء يمكن بلوغه تحت مسار يبدأ بالحروف نفسها تخدمه تلك الكتلة — وهكذا ينتهي الأمر بقاعدة /static إلى خدمة /static-backup.

أول تعبير نمطي يفوز، لا أدقّها

location ~ ^/a  ·  location ~ ^/a/b/c$  ·  GET /a/b/c
~ ^/a wins; ~ ^/a/b/c$ is unreachable

تُقيَّم التعابير النمطية بالترتيب الذي تظهر به في الملف، وأول تطابق ينهي البحث. الكتلة الثانية أدقّ وتطابق هذا المسار تماماً، ولن تُنفَّذ أبداً — لأي طلب كان. كتل البادئة تُختار بالطول بصرف النظر عن الترتيب؛ وكتل التعابير النمطية تُختار بالترتيب بصرف النظر عن الدقة. الخلط بين هاتين القاعدتين هو السبب المعتاد لتوقّف قاعدة عن العمل بعد أن «رتّب» أحدهم الملف.

التجاوز المُرمَّز يُحَلّ قبل المطابقة

location /a/  ·  location /b/  ·  GET /a/b%2F..%2Fzz
$uri becomes /a/zz, so /a/ wins

يفكّ nginx ترميز النسبة المئوية، ويحلّ . و..، ويدمج الشرطات المتكررة قبل استشارة أي كتلة. %2F يفكّ إلى فاصل حقيقي ثم يشارك في ذلك الحل، فلا يبقى هذا الهدف داخل /a/b/ — بل ينتهي إلى /a/zz. المطابقة على الهدف كما كتبته بدل $uri بعد التطبيع تعطي إجابة خاطئة هنا.

كيف تستخدم مختبر nginx location

  1. 1

    الصق كتلة server

    ضع كتلة server كاملة، أو كتل location التي تفكر فيها فقط. الكتل المتداخلة مفهومة، وأرقام الأسطر الأصلية محفوظة كي يطابق الجدول ملفك.

  2. 2

    أدخل مسار الطلب

    اكتب المسار كما يصل على الشبكة، بما فيه أي ترميز نسبة مئوية وسلسلة استعلام. الصفوف الثلاثة فوق الجدول تعرض كيف يُطبَّع قبل المطابقة.

  3. 3

    اقرأ الفائزة ثم الخاسرات

    بطاقة الحكم تسمّي الكتلة المختارة والسبب في سطر واحد. وجدول القرار تحتها يشرح كل كتلة أخرى: في أي مرحلة أُقصيت ولماذا.

  4. 4

    راجع التشخيصات

    التعابير النمطية غير المثبّتة، والبادئات التي تنقصها شرطة مائلة أخيرة، و^~ التي تحمل نمطاً بدل بادئة، والمكررات غير القابلة للوصول، ومجلدات الرفع التي يبلغها تعبير PHP — كلها مُبلَّغ عنها.

  5. 5

    شارك الحالة نفسها

    زر نسخ الرابط يشفّر الإعداد والمسار في جزء العنوان بعد #، فيفتح زميلك ما تنظر إليه بالضبط. هذا الجزء لا يُرسل إلى أي خادم إطلاقاً.

أخطاء location الشائعة في nginx

توقّع أن تتفوق ^~ على بادئة أطول

^~ لا تُستشار إلا على البادئة التي فازت بالطول أصلاً. البادئة العادية الأطول تفوز أولاً، ثم تعمل مرحلة التعابير النمطية كأن ^~ غير موجودة.

✗ خطأ
location ^~ /a/ { }
location /a/b/ { }
location ~ \.php$ { }
# /a/b/x.php -> ~ \.php$
✓ صحيح
location ^~ /a/ { }
location ^~ /a/b/ { }
location ~ \.php$ { }
# /a/b/x.php -> ^~ /a/b/

بادئة بلا شرطة مائلة أخيرة تلتقط الأشقاء

مطابقة البادئة تقارن الحروف لا مقاطع المسار، فتخدم الكتلة أيضاً كل مسار شقيق يبدأ بالحروف نفسها.

✗ خطأ
location /static { root /var/www; }
# also serves /staticfoo and /static-backup
✓ صحيح
location /static/ { root /var/www; }
location = /static { return 301 /static/; }

وضع التعبير النمطي الدقيق أسفل الواسع

تُجرَّب التعابير النمطية بترتيب الملف وأول تطابق ينهي البحث، فالكتلة الأدقّ لا تُنفَّذ أبداً لأي طلب كان.

✗ خطأ
location ~ ^/api { }
location ~ ^/api/v2/users$ { }
# the second is unreachable
✓ صحيح
location ~ ^/api/v2/users$ { }
location ~ ^/api { }

كتابة تعبير نمطي بعد ^~

^~ تأخذ بادئة حرفية. يحمّل nginx الملف دون شكوى والكتلة ببساطة لا تطابق شيئاً أبداً، وهو ما يصعّب ملاحظتها في المراجعة.

✗ خطأ
location ^~ "\.php$" { deny all; }
✓ صحيح
location ~ \.php$ { deny all; }

افتراض أن سلسلة الاستعلام تشارك في المطابقة

تُفصل سلسلة الاستعلام أثناء التطبيع، فلا تستطيع كتلة أن تطابق عليها أبداً. اقرأ $arg_name داخل الكتلة بدلاً من ذلك.

✗ خطأ
location /search?q= { }
# never matches anything
✓ صحيح
location /search {
    if ($arg_q = "") { return 400; }
}

ماذا يمكنك أن تفعل بمختبر nginx location

افحص إعداداً قبل وصوله إلى الإنتاج
استدلّ على توجيه كتلة server عدّلتها ولم تنشرها بعد. العطل الذي يمسكه هذا هو العطل الذي لا يظهر إلا مع شكل مسار بعينه، وهو تحديداً ما يفوت اختبار الدخان بعد إعادة التحميل.
اعرف لماذا توقفت قاعدة عن العمل
التعبير النمطي الذي كان يعمل وتوقف هو غالباً ضحية ترتيب: شيء طابق قبله، أو ظهرت ^~ فوقه. الجدول يوسم الكتلة بأنها غير قابلة للوصول ويسمّي الكتلة التي أخذت الطلب.
دقّق مجلد رفع أو وسائط
حمّل المثال الجاهز الذي يعيد إنتاج شكل «الرفع ثم التنفيذ»، ثم الصق مساراتك أنت. وإن كان تعبير PHP نمطي يأخذ الطلبات داخل مجلد يقبل الكتابة، فالتشخيص يقول ذلك ويسمّي الكتلتين معاً.
احسم تعليق مراجعة بدليل
زر نسخ الرابط يلتقط الإعداد والمسار بالضبط في جزء العنوان. ووضع ذلك في طلب دمج يستبدل بالجدال حول الأسبقية جدول قرار يستطيع أي أحد إعادة تشغيله.
علّم خوارزمية الاختيار
الجدولان المرجعيان مادة ساكنة قابلة للفهرسة يمكنك الإشارة إليها، وشرائح الأمثلة تُظهر كل فخّ دون الحاجة إلى تعطيل خادم. ومثال ^~ تحديداً يميل إلى إنهاء النقاش سريعاً.

كيف يختار nginx كتلة location

التطبيع يسبق استشارة أي كتلة
يُفكّ ترميز النسبة المئوية للمسار، وتُحلّ مقاطع . و..، وتُدمج الشرطات المتكررة، وعندها فقط تُختار الكتلة. و%2F بعد فكّ ترميزه يصير فاصلاً حقيقياً ويشارك في ذلك الحل، فيُطابَق /a/b%2F..%2Fzz بوصفه /a/zz. وثلاثة محارف مفكوكة استثناء تبقى حرفية: %25 و%23 و%3F — ولهذا يحمل /a%3Fx=1 علامة استفهام داخل مساره وسلسلة استعلام فارغة. والعلامة + ليست مسافة هنا؛ %20 وحدها كذلك. أما الصعود فوق الجذر والهروب غير الصالح فيُرفضان معاً بـ 400 قبل بدء المطابقة.
طول البادئة يحسم، وترتيب الإعداد لا يحسم
تُقارن كل كتلة بادئة مطابقة وتفوز الأطول، سواء ظهرت أول الملف أو آخره. والمقارنة بالحروف لا بمقاطع المسار، فتطابق /static المسار /staticfoo. والفائزة تُحفظ ولا تُستخدم فوراً، لأن مرحلة التعابير النمطية قد تتجاوزها.
^~ تكبح التعابير النمطية ولا ترفع الأولوية
لا يُفحص المُعدِّل إلا على البادئة التي فازت بالطول أصلاً. فإن طابقت أيضاً بادئة عادية أطول، حُفظت تلك بدلاً منها وعملت مرحلة التعابير النمطية كالمعتاد — ولا يبقى لكتلة ^~ أي أثر على الطلب. ووضع ^~ على كتلة متداخلة لا يحمي من تعبير نمطي مُعلَن على المستوى الخارجي، وهي لا تكبح أبداً التعابير النمطية المتداخلة داخل كتلتها هي.
التعابير النمطية تعمل بترتيب الملف وأول تطابق ينهي البحث
يحفظ nginx كتل التعابير النمطية بالترتيب الذي كُتبت به ولا يرتّبها. فلا أثر للدقة ولا للطول ولا للتثبيت في أيّها يُجرَّب أولاً، ومن ثمّ فالنمط الدقيق الموضوع أسفل نمط واسع إعداد ميت. وكتلة التعبير النمطي المطابقة يُنزَل إلى داخلها كذلك، فتُبحث كتلها المتداخلة بعدها.
PCRE وECMAScript ليستا اللغة نفسها
يترجم nginx تعابير الكتل النمطية بـ PCRE، دون وضع UTF ولا الوضع متعدد الأسطر، فتعمل الأنماط على البايتات ويثبّت ^ عند بداية المسار وحدها. وفارق واحد له وزن أمني: $ في PCRE يطابق أيضاً قبل سطر جديد أخير مباشرة، فيظل مسار ينتهي بـ %0A محقّقاً لـ \.php$ رغم أن محرك JavaScript يرفضه. هذا السلوك محاكى هنا ومُبلَّغ عنه، لأنه طريق معروف للتسلل من قواعد مبنية على امتداد الملف.

أفضل ممارسات location في nginx

احمِ المجلدات القابلة للكتابة بـ ^~ لا ببادئة عادية
أي مجلد يقبل الرفع يحتاج location ^~ /uploads/ كي لا تستطيع مرحلة التعابير النمطية تسليم ملف مخزّن إلى مفسّر. البادئة العادية تبدو مكافئة وهي ليست كذلك.
أعطِ بادئات المجلدات شرطة مائلة أخيرة
اكتب location /static/ بدل location /static إلا إذا كنت تريد عمداً أن تخدم الكتلة نفسها /staticfoo و/static-backup. وأضف location = /static منفصلة حين يحتاج المسار المجرّد معالجة أيضاً.
رتّب التعابير النمطية من الأدقّ إلى الأعمّ
أول تطابق يفوز، فالنمط الواسع فوق نمط دقيق يجعل الدقيق غير قابل للوصول. وإبقاء التعابير قليلة ومرتّبة عن قصد أسهل في الصيانة من الاستدلال على التداخل بعد وقوعه.
ثبّت التعابير النمطية التي يُقصد بها بادئة مسار
location ~ /admin تبحث في أي موضع من المسار وتطابق /public/admin/x. اكتب ~ ^/admin حين تقصد البداية. أما التثبيت عند النهاية وحدها فطبيعي وصحيح للتوجيه حسب الامتداد.
أعد فحص التوجيه بعد أي إعادة ترتيب
تحريك الكتل آمن للبادئات ويغيّر السلوك للتعابير النمطية. ولأن فرقاً يعيد ترتيب أسطر فقط يبدو غير ضار في المراجعة، فإن إعادة تشغيل المسارات المتأثرة أرخص وسيلة لالتقاطه.

أسئلة شائعة عن مختبر nginx location

كيف أعرف أي كتلة location اختارها nginx؟
الصق الإعداد ومسار الطلب في هذا المختبر لترى الكتلة الفائزة وسبب إقصاء كل كتلة أخرى. وعلى خادم يعمل، أضف error_log /var/log/nginx/debug.log debug; وابحث عن سطر using configuration الذي يسمّي الكتلة المختارة. الطريقتان تجيبان عن سؤالين مختلفين: السجلّ يخبرك بما فعله خادم حيّ، وهذه الصفحة تخبرك بما سيفعله إعداد لم تنشره بعد.
لماذا لا يعمل التعبير النمطي في كتلة location عندي؟
السبب عادة أحد ثلاثة، وجدول القرار يسمّي أيّها. إمّا أن تعبيراً أسبق طابق فلم يُنفَّذ تعبيرك — التعابير تُجرَّب بترتيب الملف وأول تطابق يفوز. أو أن أطول بادئة مطابقة تحمل ^~، وهو ما يتخطّى مرحلة التعابير النمطية كلياً. أو أن التعبير سليم لكن المسار ليس ما تظنّه: المطابقة تجري على المسار بعد التطبيع، عقب فكّ ترميز النسبة المئوية وحلّ ..، وبعد نزع سلسلة الاستعلام.
لماذا لا يعمل التطابق التام عندي؟
كتلة = تشترط تساوي المسار كاملاً، لا أن يبدأ بالنمط. location = /a/ لا تطابق /a، وlocation = /a لا تطابق /a/b. الشرطة المائلة الأخيرة حرف عادي هنا، فالصيغتان سلسلتان مختلفتان. وحين تطابق كتلة تامّة فعلاً، يتوقف البحث فوراً ولا تُقارَن أي كتلة أخرى.
هل يطابق nginx سلسلة الاستعلام داخل كتلة location؟
لا. تُفصل سلسلة الاستعلام أثناء التطبيع ويجري اختيار الكتلة على المسار وحده. ولهذا تطابق location = /a طلباً على /a?x=/b. وإن احتجت التفرّع حسب معامل، فاقرأ $arg_name أو $args داخل الكتلة. وهناك دقيقة تستحق المعرفة: %3F يفكّ إلى علامة استفهام حرفية تبقى في المسار، فيكون لـ /a%3Fx=1 سلسلة استعلام فارغة ومسار يحتوي ؟ بالصيغة اللاتينية ?.
هل أستطيع استخدام صياغة تعابير JavaScript النمطية في كتلة location؟
لا — يستخدم nginx محرك PCRE، والفروق مهمة. هذه الصفحة تعمل في متصفحك حيث لا توجد سوى تعابير ECMAScript النمطية، لذا تُكتشف تراكيب PCRE الحصرية ويُنبَّه عليها بدل تقييمها تقييماً خاطئاً صامتاً: المجموعات الذرّية، والمكمّمات الاستحواذية، والمُعدِّلات السطرية مثل (?i)، وأصناف POSIX مثل [[:alpha:]]، وهروب مثل \A و\K التي يقرأها JavaScript بصمت كحروف عادية. وحين تُوسَم كتلة، تُقيَّم بقية المرشحات بترتيب nginx نفسه، لكن حكم تلك الكتلة يحتاج تحققاً على خادم حقيقي. وإن كنت تكتب النمط نفسه، فإن مختبر التعابير النمطية يغطي صياغة ECMAScript بتفصيل.
هل مطابقة بادئات location حسّاسة لحالة الأحرف؟
على لينكس نعم — location /Static/ لا تطابق /static/x. أما على أنظمة ملفات غير حسّاسة لحالة الأحرف مثل macOS وCygwin، فيقارن nginx البادئات دون تمييز الحالة، ويفرض إضافةً إلى ذلك على كل كتلة تعبير نمطي أن تتصرف كأنها ~*. هذه الصفحة تحاكي سلوك لينكس، وهو ما تعمل به خوادم الإنتاج غالباً. وإن كنت تطوّر على Mac وتنشر على لينكس، فقد يخفي هذا الفارق قاعدة معطوبة حتى لحظة النشر.
هل يغيّر try_files الكتلة المختارة؟
لا. اختيار الكتلة ينتهي أولاً؛ ثم يعمل try_files بعده داخل الكتلة التي فازت. وإن لم يصل الطلب أصلاً إلى الكتلة التي تحتوي try_files، فالتوجيه بلا معنى — والسبب المعتاد تعبير ~ \.php$ يخطف الطلب قبل أن تتاح الفرصة لكتلة البادئة صاحبة الاحتياطي. أما إعادة التوجيه الداخلية اللاحقة فتعيد تشغيل المطابقة فعلاً، فيُحَل المسار المُعاد كتابته على قائمة الكتل من أولها.
لماذا يردّ nginx بـ 301 حين أطلب مجلداً بلا شرطة مائلة؟
آليتان مختلفتان تنتجان ذلك. إن كانت كتلة ينتهي اسمها بـ / تحمل proxy_pass أو أي توجيه *_pass آخر، فإن الطلب على المسار نفسه بلا شرطة مائلة يُجاب بـ 301 أثناء اختيار الكتلة — قبل تقييم أي تعبير نمطي. وبشكل منفصل، تُصدر وحدة الملفات الساكنة 301 حين يشير المسار إلى مجلد حقيقي على القرص. الأولى ظاهرة هنا؛ والثانية تعتمد على نظام ملفاتك. وإضافة location = /path تكبح الأولى.
هل تغيّر كتل location المتداخلة النتيجة؟
نعم، وبطريقة يسهل إغفالها. ينزل nginx إلى داخل كتلة البادئة الفائزة ويبحث في أبنائها، فيُجرَّب التعبير النمطي المتداخل قبل تعابير المستوى الأب. ووجود ^~ على الكتلة الخارجية لا يحميها من تعابيرها النمطية المتداخلة، كما يمكن للتداخل أن يجعل بادئة أطول على المستوى العام غير قابلة للوصول حين تفوز كتلة شقيقة على المستوى الخارجي أولاً. الكتل المتداخلة مُمثَّلة هنا بالإزاحة نفسها التي كتبتها بها.
هل يُرفع إعداد nginx الخاص بي إلى أي مكان؟
لا. التحليل والمطابقة يجريان محلياً داخل متصفحك بعمليات نصية بسيطة — لا استدعاء لأي خادم ولا احتفاظ بأي شيء. وهذا هنا أهم منه في معظم الأدوات، لأن كتلة server حقيقية تحوي أسماء مضيفات المنبع ومنافذ داخلية ومسارات شهادات وقواعد مصادقة. ولست مضطراً لتصديقنا: افتح أدوات المطور في متصفحك وراقب لوحة الشبكة وهي صامتة أثناء كتابتك، أو اقطع الاتصال تماماً وواصل الاختبار. غياب أي طلب خارجي يفرضه كذلك اختبار تعاقدي آلي مع كل بناء، فلا يمكن أن يتراجع بصمت.

أدوات ذات صلة

عرض جميع الأدوات →

منشئ أوامر cURL وبنّاؤها

الويب وAPI

ابنِ أوامر curl في متصفحك — حدد الطريقة والترويسات والمصادقة والجسم، واحصل على أمر جاهز للنسخ فوراً. إعدادات مسبقة لـ Bearer وPOST JSON ورفع الملفات. مجاني وخاص وبلا تسجيل.

مولّد htpasswdbcrypt وحماية الويب

الويب وAPI

أنشئ مدخلات htpasswd بـ bcrypt وApache MD5 (apr1) وSHA-1 والمزيد. احصل على إعداد Apache وnginx وDocker جاهز للصق. 100% في متصفحك — بدون رفع.

مولّد وسوم Open Graph وميتا

الويب وAPI

أنشئ وسوم Open Graph وبطاقات Twitter ووسوم SEO مع معاينة حية على Google وFacebook وX. مجانية 100% وداخل المتصفح، بدون تسجيل — انسخ الكود والصقه.

محلّل traceparentW3C Trace Context

الويب وAPI

كفى عدّ الخانات الست عشرية. محلّل traceparent مجاني وأونلاين — يعمل داخل متصفحك ولا يرفع شيئاً. معرّف التتبّع والمقطع، بتات trace-flags الثمانية، tracestate، Datadog/X-Ray/B3.

فك تشفير AES — يدعم OpenSSL/CryptoJS

أدوات الأمن

فك تشفير AES أونلاين — GCM/CBC/CTR، عبارة مرور أو مفتاح خام، يكتشف تلقائيًا صيغة OpenSSL وCryptoJS "U2FsdGVkX1". يعمل 100% داخل المتصفح، والمفاتيح لا تغادر الصفحة أبدًا.

أداة تشفير AESGCM/CBC/CTR

أدوات الأمن

أداة تشفير AES مجانية أونلاين — AES-128/192/256، GCM/CBC/CTR، عبارة مرور (PBKDF2) أو مفتاح خام. تعمل 100% داخل متصفحك؛ لا شيء يُرفع.