سؤال

الآن أفعل شيئًا مثل هذا:

RewriteRule ^/?logout(/)?$ logout.php
RewriteRule ^/?config(/)?$ config.php

أفضل أن يكون لدي قواعد واحدة من شأنها أن تفعل الشيء نفسه لكل عنوان url، لذلك لا أضطر إلى الاستمرار في إضافتها في كل مرة أقوم فيها بإضافة ملف جديد.

كما أحب أيضًا مطابقة أشياء مثل "/config/new" مع "config_new.php" إذا كان ذلك ممكنًا.أعتقد أن بعض التعبيرات العادية ستسمح لي بإنجاز هذا؟

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

المحلول

يحاول:

RewriteRule ^/?(\w+)/?$ $1.php

$1 هو محتوى السلسلة الملتقطة الأولى بين قوسين.ليست هناك حاجة للأقواس حول الشرطة المائلة الثانية.

يحرر:بالنسبة للمباراة الأخرى، جرب هذا:

قاعدة إعادة الكتابة ^/?(\w+)/(\w+)/?$ $1_$2.php

نصائح أخرى

سأفعل شيئًا مثل هذا:

RewriteRule ^/?(logout|config|foo)/?$ $1.php
RewriteRule ^/?(logout|config|foo)/(new|edit|delete)$ $1_$2.php

أفضل أن أدرج عناوين URL التي أريد مطابقتها بشكل صريح، حتى لا أقلق بشأن المحتوى الثابت أو إضافة أشياء جديدة لاحقًا لا تحتاج إلى إعادة كتابتها إلى ملفات php.

ما ورد أعلاه على ما يرام إذا كانت جميع عناوين URL الفرعية صالحة لجميع عناوين URL الجذر (book/new, movie/new, user/new)، ولكن ليس جيدًا إذا كنت تريد الحصول على عناوين URL فرعية مختلفة اعتمادًا على إجراء الجذر (logout/new لا معنى له).يمكنك التعامل مع ذلك إما باستخدام تعبير عادي أكثر تعقيدًا، أو عن طريق توجيه كل شيء إلى ملف php واحد والذي سيحدد الملفات التي سيتم تضمينها وعرضها بناءً على عنوان url.

لا يمكن لإعادة كتابة Mod إجراء عمليات استبدال غير محدودة (من المحتمل) كما تريد القيام به في الجزء الثاني من سؤالك.ولكن تحقق من محرك إعادة الكتابة الخارجي في الجزء السفلي من الملف دليل إعادة كتابة عنوان URL الخاص بـ Apache:

محرك إعادة الكتابة الخارجي

وصف:

الأسئلة الشائعة:كيف يمكننا حل مشكلة FOO/BAR/QUUX/etc.مشكلة؟يبدو أنه لا يوجد حل باستخدام mod_rewrite...حل:

استخدم RewriteMap خارجيًا، على سبيل المثال.برنامج يعمل مثل RewriteMap.يتم تشغيله مرة واحدة عند بدء تشغيل Apache ويتلقى عناوين URL المطلوبة على STDIN ويجب عليه وضع عنوان URL الناتج (المعاد كتابته عادةً) على STDOUT (بنفس الترتيب!).

RewriteEngine on
RewriteMap    quux-map       prg:/path/to/map.quux.pl
RewriteRule   ^/~quux/(.*)$  /~quux/${quux-map:$1}

#!/path/to/perl

#   disable buffered I/O which would lead
#   to deadloops for the Apache server
$| = 1;

#   read URLs one per line from stdin and
#   generate substitution URL on stdout
while (<>) {
    s|^foo/|bar/|;
    print $_;
}

هذا مثال توضيحي فقط ويقوم فقط بإعادة كتابة جميع عناوين URL /~quux/foo/...إلى /~quux/bar/....في الواقع يمكنك برمجة ما تريد.لكن لاحظ أنه على الرغم من أن مثل هذه الخرائط يمكن استخدامها أيضًا من قبل مستخدم عادي، إلا أن مسؤول النظام فقط هو الذي يمكنه تحديدها.

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