قاعدة mod_rewrite لإعادة توجيه جميع الطلبات باستثناء مسار واحد محدد

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

  •  09-06-2019
  •  | 
  •  

سؤال

أحاول إعادة توجيه جميع الطلبات إلى المجال الخاص بي إلى مجال آخر باستخدام mod_rewrite في إعلان Apache 2.2 VirtualHost.هناك استثناء واحد لهذا - أود أن يتم إرسال جميع الطلبات إلى /audio طريق لا ليتم إعادة توجيهها.

لقد كتبت RewriteCond وRewriteRule للقيام بذلك ولكن هذا ليس صحيحًا تمامًا ولا أستطيع معرفة السبب.يحتوي التعبير العادي على نظرة أمامية سلبية للسلسلة "/ audio"، لكن هذا غير مطابق لسبب ما.وهنا التعريف:

RewriteEngine on
RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net(?!/audio) [NC]
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]

إذا قمت بتغيير RewriteCond إلى:

RewriteCond %{HTTP_HOST} ^(.*\.)?mydomain\.net/(?!audio) [NC]

(أي.ضع الشرطة المائلة للأمام خارج الجزء الأمامي السلبي) ثم تعمل، ولكن الجانب السلبي لذلك هو أنه لن تتم إعادة توجيه الطلبات الموجهة إلى mydomain.net بدون شرطة مائلة زائدة.

هل يمكن لأي شخص أن يشير إلى ما أفعله خطأ؟

(ملحوظة:تتم إضافة الأقواس الزاوية حول المجال في بت RewriteRule أعلاه بواسطة StackOverflow.com - فهي غير موجودة في الكود الفعلي!)


وهنا القواعد:

<VirtualHost *:80>
ServerAdmin me@mydomain.net
DocumentRoot "/var/www/mydomain.net/htdocs"
ServerName www.mydomain.net
ServerAlias mydomain.net

RewriteEngine on
RewriteCond {REQUEST_URI} !^/audio
RewriteRule ^(.*)$ http://www.newdomain.net [L,R=301]
RewriteLog logs/mod_rewrite_log
RewriteLogLevel 3

ErrorLog logs/error_log
CustomLog logs/access_log common
</VirtualHost>

شكرًا @mercutio - هذا منطقي تمامًا ولكن لا يبدو أنه يعمل.

إليك ما يقوله سجل mod_rewrite عندما أقوم بتقديم طلب لذلك http://mydomain.net/audio/something.mp3:

(2) init rewrite engine with requested uri /audio/something.mp3
(3) applying pattern '^(.*)$' to uri '/audio'
(2) rewrite '/audio' -> 'http://www.newdomain.net/'
(2) explicitly forcing redirect with http://www.newdomain.net
(1) escaping http://www.newdomain.net for redirect
(1) redirect to http://www.newdomain.net [REDIRECT/301]

نظرًا لأن REQUEST_URI يبدأ بـ /audio أتوقع أن يتم تجاهل RewriteRule.

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

المحلول

يحتوي HTTP_HOST على اسم المضيف فقط، وليس مسار عنوان URL المطلوب.

RewriteCond %{REQUEST_URI} !^/audio

ينبغي أن يكون كل ما تحتاجه.

علاوة على ذلك، يمكنك الحصول على معلومات تصحيح الأخطاء من محرك إعادة الكتابة بما يلي، وهو أمر مفيد حقًا لمعرفة كيفية مطابقة الشروط والقواعد الخاصة بك:

RewriteLog /path/to/log/file
RewriteLogLevel 3
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top