توجيهات .htaccess إلى *عدم* إعادة توجيه عناوين URL معينة

StackOverflow https://stackoverflow.com/questions/3157

  •  08-06-2019
  •  | 
  •  

سؤال

في أحد التطبيقات التي تعتمد بشكل كبير على .htaccess RewriteRules لعناوين PrettyURL الخاصة بها (CakePHP في حالتي)، كيف أقوم بإعداد التوجيهات بشكل صحيح لاستبعاد أدلة معينة من إعادة الكتابة هذه؟إنه:

/appRoot/.htaccess
         app/
         static/

بشكل افتراضي كل طلب ل /appRoot/* يتم إعادة كتابتها ليتم التقاطها app/webroot/index.php, ، حيث يتم تحليلها واستدعاء إجراءات وحدة التحكم المقابلة.ويتم ذلك من خلال هذه التوجيهات في .htaccess:

RewriteBase /appRoot

RewriteRule ^$ app/webroot/     [L]
RewriteRule (.*) app/webroot/$1 [L]

أريد الآن استبعاد بعض الدلائل مثل static/ من إعادة الكتابة هذه.حاولت مع هذا قبل قواعد إعادة كتابة الكعكة:

RewriteCond $1 ^(static|otherDir).*$ [NC]
RewriteRule (.*) - [L]

إنه يعمل حتى الآن بحيث لم تعد تتم إعادة كتابة الطلبات، ولكن الآن الجميع يتم تخطي الطلبات، حتى طلبات الكعك المشروعة التي لا ينبغي أن تتطابق ^(static|otherDir).*$.

لقد جربت العديد من الأشكال المختلفة لهذه القواعد ولكن لم أتمكن من تشغيلها بالطريقة التي أريدها.

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

المحلول

والإجابة الصحيحة iiiiii...

RewriteRule   ^(a|bunch|of|old|directories).* - [NC,L]

# all other requests will be forwarded to Cake
RewriteRule   ^$   app/webroot/   [L]
RewriteRule   (.*) app/webroot/$1 [L]

ما زلت لا أفهم سبب استدعاء ملف Index.php الموجود في الدليل الجذر في البداية حتى مع وجود هذه التوجيهات.وهي موجودة الآن في

/appRoot/app/views/pages/home.ctp

ويتم التعامل معها من خلال الكعكة أيضًا.مع وجود هذا في مكانه الآن، أفترض أن هذا كان سيعمل أيضًا (نسخة معدلة قليلاً من اقتراح مايك، لم يتم اختبارها):

RewriteCond $1      !^(a|bunch|of|old|directories).*$ [NC]
RewriteRule ^(.*)$  app/webroot/$1 [L]

نصائح أخرى

هل لا يمكنك تطبيق الشرط على القواعد التالية، ولكن مع النفي، كما في (مع بعض الاختلافات، لست جيدًا في تذكر قواعد .htaccess، لذلك قد تكون العلامات خاطئة):

RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/ [L]

RewriteCond $1 !^(static|otherDir).*$ [NC]
RewriteRule ^$ app/webroot/$1 [L]

قم بإزالة [L] من القواعد السابقة:

RewriteBase /appRoot

RewriteRule ^$ app/webroot/    
RewriteRule (.*) app/webroot/$1

[L] يعني "أوقف عملية إعادة الكتابة هنا ولا تطبق أي قواعد إعادة كتابة أخرى."

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