mod_alias AliasMatch Regex - مطابقة كل شيء في مجلد باستثناء نمطين؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

أرغب في استخدام AliasMatch لإنشاء اسم مستعار لكل شيء داخل المجلد، يستثني لاثنين (أو أكثر) من أنماط التعبير العادي المحددة.

على سبيل المثال، يقوم AliasMatch التالي بإنشاء اسم مستعار لكل شيء في مجلد "المحتوى":

AliasMatch /content(.*) /home/username/public_html/$1

ولكن هناك نوعان من أنماط التعبير العادي التي لا أريد أن يتطابق معها الاسم المستعار أعلاه، على سبيل المثال:

^content/([a-zA-Z0-9_-]+)/id-([a-zA-Z0-9_-]+)/([0-9]+)
^content/([a-zA-Z0-9_-]+)/nn-([a-zA-Z0-9_-]+)

أعلم أنه يمكن استخدام الحرف NOT (!) لإلغاء أحد الأنماط، لكنني لا أعرف كيفية استخدامه هنا، أو كيفية إلغاء أنماط متعددة في AliasMatch.

كيف يمكن انجاز هذا؟

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

المحلول

وماذا كنت تتحدث عن ما يسمى <م> سلبية lookahead ، وكنت مجرد التفاف حولها التعبير المعتاد لماذا أنت لا تريد أن تطابق، مثل هذا: (?!foo). يمكن الجمع بين regexes تكون بسيطة مثل سلسلة بعضهم البعض، مع أنبوب بينهما، ولكن يمكنك أن تفعل أفضل قليلا من ذلك في هذه الحالة. هذه التعابير المنطقية إعادة استعمال الجزء الأول من regexes اثنين، وهو مطابق:

[a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+)

ولأن الأنابيب (أو '|'، المشغل التناوب) له الأسبقية أقل من أي شيء آخر، واختلاف لابد الواردة في المجموعة. لاحظ أنني استخدمت <م> مجموعة غير التقاط - أي (?:...) - وتخلصوا من الأقواس في regexes الخاص بك. خلاف ذلك، لكانوا قد خلعت ترقيم مجموعة واحدة لك <م> قيام تريد التقاط، وكنت قد اضطرت إلى استخدام شيء آخر غير $1 في الجزء الثاني من القاعدة. وهنا التعبير المعتاد كله:

^/content(?![a-zA-Z0-9_-]+/(?:id-[a-zA-Z0-9_-]+/[0-9]+|nn-[a-zA-Z0-9_-]+))(.*)

وتحرير: على ما يبدو، نكهة التعبير العادي المستخدمة من قبل AliasMatch لا يدعم lookaheads، ولكن لديها قناعاتها نفي بناء الجملة: !(^/foo). والغرض منه ويبدو أن لنفي التعبير المعتاد كله، وهو ما يعني أنها لن تساعدك، ولكن ربما لم يكن في حاجة إليها. ربما يمكنك فقط الاسم المستعار هذه الدلائل لأنفسهم. ثم لن يكون لكم أي شيء ينفي.

AliasMatch ^(/content/[a-zA-Z0-9_-]+/id-[a-zA-Z0-9_-]+/[0-9]+.*) $1
AliasMatch ^(/content/[a-zA-Z0-9_-]+/nn-[a-zA-Z0-9_-]+.*) $1
AliasMatch ^/content/(.*) /home/username/public_html/$1

وأو ربما يمكنك أن تفعل شيئا مع توجيه <DirectoryMatch>، أو عن طريق التحول إلى mod_rewrite و. ولكن أنا (من الواضح) لست خبيرا أباتشي - تخصصي هو regexes، وأنا لا أعتقد أن التعابير المنطقية هو الذهاب الى حل مشكلتك

.

نصائح أخرى

ModAlias ​​يدعم في الواقع التطلعات السلبية.أنا أستخدم هذا على موقعي، وهو يعمل بشكل جيد جدًا:

AliasMatch ^/(?!w/|BingSiteAuth\.xml$|favicon\.ico$|google.{16}\.html$|robots\.txt$) /path/to/file

تأكد من أن التعبير العادي الخاص بك يبدأ بـ "/"، لأنه دائمًا الحرف الأول مع mod_alias!لا تحاول أبدًا بدء قاعدتك بنظرة أمامية، وإلا فسيفشل التحليل.

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