it-swarm.asia

اباتشي RewriteRule لا إعادة توجيه

لدي هذا في ملفي .htaccess:

RewriteEngine on

RewriteRule ^images/chart\.png$    /static/images/chart.png    [L,R=301]
RewriteRule ^images/artwork/(.+).png   /static/artwork/$1.jpg  [L,R=301]

# codeigniter
RewriteCond $1 !^(index\.php|static|images|admin|user_guide|sitemap\.xml\.gz|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

يجب أن يتجاهل الجزء CodeIgniter المجلدين images و static. ومع ذلك ، عندما أفتح example.com/images/chart.png أحصل على صفحة CI 404. 301 إعادة توجيه أخرى تعمل بشكل جيد.

لا يمكن فهم هذا واحد ، هل لدى أي فكرة؟

3
DisgruntledGoat

تمكنت من إصلاح هذا بنفسي في النهاية عن طريق إزالة دليل الصور من جملة CI RewriteCond. (لا يزال غير متأكد بنسبة 100 ٪ لماذا نجح ذلك لأن طلب images/chart.png لا ينبغي أن يكون حتى وصل إلى الجزء CI).

0
DisgruntledGoat

ما يحدث هنا هو أن إعادة الكتابة تعمل بالفعل ، لكن R = 301 تسبب تكرارًا ثانويًا يسبب 404.

يأتي الطلب لـ images/chart.png وتذهب قواعد إعادة الكتابة إلى العمل. عندما يتطابق مع القاعدة الأولى ، فإنه يؤدي إلى إعادة توجيه 301. يُخبر إعادة التوجيه 301 هذه المستعرض بإصدار طلب جديد لـ /static/images/chart.png.

لذا فإن الطلب الجديد يجعله على الخادم الخاص بك ، ويتم تنفيذ قواعد إعادة الكتابة مرة أخرى. هذه المرة ، لا يتطابق الطلب مع القواعد المخصصة في الجزء العلوي ويجعله في قاعدة CodeIgniter. نظرًا لأن عنوان URL الجديد الخاص بك يبدأ بـ "ثابت" ، فإنه يطابق قاعدة CI ويعيد التوجيه إلى /index.php?/static/images/chart.png. نظرًا لأن CI ليس لديه أدنى فكرة عن كيفية التعامل مع هذا (أفترض) ، فإنه يرمي 404 لإبلاغ المستخدم بأنه لا يستطيع العثور على المورد.

ما تريد القيام به هو تحديث قاعدة CI لإضافة الشروط التالية:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

سيُعلم هذا mod_rewrite بتنفيذ القاعدة فقط إذا كان الطلب لملف موجود حرفيًا (!-f) أو دليل (!-d).

بمجرد إجراء هذا التحديث ، ستتسبب القاعدة الأولى في إعادة التوجيه نفسها لـ /static/images/chart.png ولكن نظرًا لوجود هذا الملف حرفيًا في هذا المسار ، فإن قواعد CI ستتركه بمفرده ، ولن تتم إعادة كتابة جديدة. سيقوم الخادم بعد ذلك بعرض الصورة بشكل طبيعي.

0
AgentConundrum