سؤال

أود أن استخدام وزارة الدفاع إعادة كتابة في تحويل عناوين صفحات الويب مثل /الدليل إلى /directory/index.html, في مصباح القياسية استضافة الوضع.ما قد يعمل على العناوين التي تنتهي في خط مائل.أنا لا يمكن العثور على طريقة التعامل مع العناوين التي لا نهاية مائل.

ما يبدو أنه ينبغي أن العمل هو:

rewriterule ^(.*)/$ $1/index.html [L] /* addresses ending in / */
rewriterule ^(.*(?!html))$ $1/index.html [L] /* where the problem is */

لكن السطر الثاني يؤدي إلى 500 خطأ خادم.إذا قمت بإضافة حرف واحد x إلى السطر الثاني:

rewriterule ^(.*)/$ $1/index.html [L]
rewriterule ^(.*x(?!html))$ $1/index.html [L]

ويبدأ العمل ، ولكن فقط دليل الأسماء التي تنتهي في العاشر.لقد حاولت استبدال x مع العديد من الأشياء المختلفة.أي شيء أكثر تعقيدا من الشخصيات الحقيقية (مثل [^x] أو .+) يعطي 500 خطأ خادم.

و لإشباع فضولي, لا أحد يعرف لماذا بالإضافة إلى واحد حقيقي رسالة يجعل الفرق بين الخادم خطأ تماما عمل القاعدة ؟

[قبول الإجابة] بفضل البامية كنت قادرا على تقريب الحل باستخدام rewritecond:

rewritecond %{REQUEST_URI} !\.[^/]+$
rewriterule (.+) $1/index.html [L]

يعمل هذا ، ولكن المرشحات أكثر من مجرد .html-يمكن أن كتلة صفحات أخرى.لسوء الحظ ،

rewritecond %{REQUEST_URI} !\.html$

النتائج في خطأ في الخادم:

طلب تجاوز حدود 10 الموجهات الداخلية بسبب احتمال خطأ في التكوين.استخدام 'LimitInternalRecursion إلى زيادة الحد إذا لزم الأمر.

أود أن أعرف لماذا:

rewriterule ^(.*(?!html))$ $1/index.html [L]

النتائج في حلقة.النصف الأول من المفترض أن تحقق إذا كان لا نهاية في .html.منذ النصف الثاني يضيف .html يبدو المكافئ الوظيفي:

while(substr($address,-4)!='html') $address.='html'

ومن الواضح أن أنا في عداد المفقودين شيء.

هل كانت مفيدة؟

المحلول

استخدام RewriteCond التوجيه إلى التحقق من ما إذا كان عنوان URL الطريق لا ينتهي .html:

RewriteCond %{REQUEST_URI} !\.html$
RewriteRule ^(.*[^/])?/?$ $1/index.html [L]

تحرير كنت تستخدم نظرة إلى الأمام التأكيد ((?!…)).ولكن ليس هناك أي شيء بعد .* (فقط $).وذلك في محاولة نظرة وراء التأكيد بدلا من ذلك:

RewriteRule ^.*$(?<!html) $0/index.html [L]

ولكن لاحظ أنك ربما تحتاج اباتشي 2.2 استخدام هذه التأكيدات.

نصائح أخرى

حسنا, في الواقع مما يجعل من العمل ، يمكنك فقط استخدام سلبي lookbehind بدلا من lookahead:

RewriteRule ^(.*)(?<!html)$ $1/index.html [L]

لست متأكدا مرتجلا لماذا مضيفا 'x' يجعل من العمل سوف تحرير لو أنها من أصل الرقم.

لماذا إضافة x يجعل من العمل:إذا استبدال يطابق regex ، روريترول سيتم تطبيقها مرة أخرى.وكمثال على ذلك, وهذا يسبب خطأ:

RewriteRule ^(.*)$ $1.rb

لأن ذلك من شأنه أن يحل محل script مع script.rb.أن يطابق regex ، لذلك محل script.rb مع script.rb.rb, مرة أخرى ومرة أخرى...

هذا هو ألمح في سجل الخطأ:

Request exceeded the limit of 10 internal redirects due to probable configuration error. Use 'LimitInternalRecursion' to increase the limit if necessary.

في المثال الخاص بك ، يمكنك إضافة index.html إلى النهاية.عندما يكون هناك x في نهاية regex فلن تطابق استبدال الذي ينتهي في l.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top