عند المتصفّح وعند محرّك البحث، /about و/about/ عنوانان. فإن عاد كلاهما بـ 200 فعندك نسختان من كلّ صفحة. والعلاجُ أن تختار صورةً وتحوّل الأخرى إليها — والطريقُ الذي يُخطئ فيه ذلك حلقة.

اختر واحدة

# nginx: no trailing slash
rewrite ^/(.*)/$ /$1 permanent;

# nginx: with a trailing slash
rewrite ^([^.]*[^/])$ $1/ permanent;

النمطُ الثاني يستثني عمدًا كلّ ما فيه نقطة، فلا تُرسَل الملفّات — /logo.png و/robots.txt — إلى /logo.png/.

الحلقة

قاعدتان تختلفان — واحدةٌ تضيف الشرطة وأخرى تحذفها — تُنتجان تحويلًا بلا نهاية. ويقع ذلك عادةً حين تكون لخادم الوِب قاعدةٌ ولإطار عمل التطبيق نقيضُها. أصلحه في مكانٍ واحد، وليكن التطبيقَ إن كان له رأي.
curl -sSIL https://example.com/about | grep -E '^HTTP|^location' | head -10

وأكثرُ من تحويلٍ في ذلك الخرج، أو العنوانان نفسُهما يتناوبان، هو الحلقة. انظر حلقات التحويل.

والأدلّة هي الاستثناء

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

قل أيَّهما المعياريّ

<link rel="canonical" href="https://example.com/about">
وأيَّهما اخترت فاجعل خريطةَ الموقع والوسمَ المعياريّ والروابطَ الداخليّة تتّفق معه. فموقعٌ يربط داخليًّا إلى الصورة التي يحوّل عنها بعد ذلك يدفع رحلةَ ذهابٍ وإياب مع كلّ نقرة.