apache mod_rewrite قاعدة واحدة لأي عدد من الاحتمالات

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

  •  02-07-2019
  •  | 
  •  

سؤال

أنا أقوم بإنشاء موقع ويب كبير إلى حد ما وبدأ .htaccess الخاص بي يشعر بالانتفاخ قليلاً، هل هناك طريقة لاستبدال نظامي الحالي - قاعدة واحدة لكل عدد من العدد المحتمل من vars التي يمكن تمريرها، إلى قاعدة واحدة تجمع الكل التعبير الذي يمكن أن يمثل أعدادًا مختلفة من المدخلات؟

على سبيل المثال لدي حاليا:

RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4&$5=$6
RewriteRule ^([a-z]+)/([^/]*)/([^/]*)/([^/]*)$ /index.php?mode=$1&id=$2&$3=$4
RewriteRule ^([a-z]+)/([^/]*)$ /index.php?mode=$1&id=$2
RewriteRule ^([a-z]+)$ /index.php?mode=$1

المرجع الخلفي الأول هو دائمًا وضع و(إن وجد) الثاني دائمًا بطاقة تعريف, ، وبعد ذلك تتناوب أي مراجع خلفية أخرى بين اسم الإدخال وقيمته

http://www.example.com/search
http://www.example.com/search/3039/sort_by/name_asc/page/23

أحب أن أكون قادرًا على الحصول على تعبير واحد للتعامل مع جميع المدخلات بأمان.

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

المحلول

افعل مثل دروبال:

  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]

ثم تعامل مع جميع العناصر الموجودة في البرنامج النصي الخاص بك باستخدام كود PHP مثل هذا

$pathmap = ();
if ($_GET["q"]){
    $path = split("/", $_GET["q"]);
    for ($i=0; $i+1<count($path); $i++){
        $pathmap[$path[$i]] = $path[$i+1];
        $i++;
    }
}

نصائح أخرى

لا أعرف ما إذا كان من الممكن القيام بذلك باستخدام تعبير واحد، ولكن يمكن القيام به باستخدام عدد ثابت من التعبيرات، بغض النظر عن طول سلسلة الاستعلام.

سيتم استدعاء قواعد mod_rewrite الخاصة بك بشكل متكرر، مما يمنحك ما يسمى أحيانًا بالعودية mod_rewrite.هناك تقنيات لتجنب ذلك، ولكن أعتقد أنك تريد استخدامها.

قم بإعداد قاعدة تستبدل الزوج الأخير بالاسم=القيمة&

استمر في متابعة سلسلة استعلام الإدخال إلى الإخراج.في كل مرة، ستصبح سلسلة الاستعلام الخاصة بك أطول وسيصبح عنوان URL الخاص بك أقصر.

في النهاية، لديك فقط قيمة واحدة تطابق قاعدتك الأخيرة.

يجب عليك التقاط سلسلة الاستعلام باستخدام

RewriteCond %{QUERY_STRING} ^(.*)$

ثم تقوم بإضافته مرة أخرى إلى الإخراج باستخدام %1

سينتهي بك الأمر بأربعة أسطر.

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

RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [L]
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1.php?%1 [L]

سيؤدي هذا إلى إعادة كتابة ما يلي

/mypage/param1/val1/param2/val2/param3/val3/...     --->
/mypage.php?param1=val1&param2=val2&param3=val3&...

ويتوقف عندما يتبقى معلمة واحدة فقط.سوف يأخذ "المعلمة" الأولى ويستدعي ملف .php بهذا الاسم.لا يوجد حد لعدد أزواج المعلمة/فال.

لا أعتقد أن هذه طريقة - ولكني أقول إن أفضل رهان لك هو أن يقوم البرنامج النصي "index.php" بمعالجة المسار بدلاً من الاضطرار إلى القيام بالعديد من المراجع الخلفية.

على سبيل المثال، إعادة كتابة الخاص بك سيكون

RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

أو مشابه...وهذا من شأنه أن يجعل المتغير $_SERVER['REQUEST_URI'] يحتوي على معلومات المسار، والتي يمكنك تقسيمها وتحليلها.

$path = split('/', $_SERVER['REQUEST_URI']);
array_shift($path); // We always have a first null value
$mode = array_shift($path);

ينتهي هذا بـ $mode الذي يحتوي على الوضع، و$path الذي يحتوي على مجموعة من العناصر التي تمثل بقية المسار، لذا

http://example.com/foo/bar/baz

سيترك لك $mode وهو "foo" و$path هو مصفوفة تحتوي على "bar" و"baz"

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