سؤال إعادة توجيه أو تغيير عناوين URL أو إعادة توجيه HTTP إلى HTTPS في Apache - كل ما تريد معرفته عن قواعد Mod_Rewrite ولكنك كنت خائفًا من طرح الأسئلة


هذا ال السؤال الكنسي حول mod_rewrite أباتشي.

يتم تغيير عنوان URL للطلب أو إعادة توجيه المستخدمين إلى عنوان URL مختلف عن العنوان الذي طلبوه في الأصل باستخدام mod_rewrite. وهذا يشمل أشياء مثل:

  • تغيير HTTP إلى HTTPS (أو العكس)
  • تغيير الطلب إلى صفحة لم تعد موجودة لاستبدال جديد.
  • تعديل تنسيق عنوان URL (مثل: id = 3433 إلى / id / 3433)
  • عرض صفحة مختلفة استنادًا إلى المتصفح ، بناءً على المُحيل ، استنادًا إلى أي شيء ممكن تحت القمر والشمس.
  • أي شيء تريد العبث به باستخدام عنوان URL

كل ما تريد معرفته عن قواعد Mod_Rewrite ولكن كنت أخشى أن تسأل!

كيف يمكنني أن أصبح خبيراً في كتابة قواعد mod_rewrite؟

  • ما هو الشكل الأساسي وهيكل قواعد mod_rewrite؟
  • ما هو الشكل / النكهة للتعبيرات العادية التي أحتاجها للحصول على فهم قوي؟
  • ما أكثر الأخطاء / الأخطاء الشائعة عند كتابة قواعد الكتابة؟
  • ما هي الطريقة الجيدة لاختبار قواعد mod_rewrite والتحقق منها؟
  • هل هناك SEO أو آثار في الأداء لقواعد mod_rewrite يجب أن أكون على علم بها؟
  • هل هناك مواقف شائعة قد يبدو فيها mod_rewrite كأداة مناسبة لهذا المنصب ولكن ليس كذلك؟
  • ما هي بعض الأمثلة الشائعة؟

مكان لاختبار القواعد الخاصة بك

ال اختبار htaccess موقع الويب هو مكان رائع للعب مع القواعد الخاصة بك واختبارها. حتى أنه يعرض إخراج التصحيح حتى تتمكن من رؤية ما هو متطابق وما لم يفعل ذلك.


257
2017-12-20 16:59


الأصل


الفكرة وراء هذا السؤال هو إعطاء مسارًا وثيقًا لجميع الأسئلة التي لا نهاية لها من mod_rewrite التي تدفع مستخدمينا الأكثر إصرارًا إلى الجنون. هذا يشبه إلى حد كبير ما تم القيام به مع الشبكات الفرعية في serverfault.com/questions/49765/how-does-subnetting-work . - Kyle Brandt♦
أيضا ، أنا لا أريد حقا الكثير من upvotes على هذا سؤال، بل يجب أن يذهبوا إلى الإجابة. لا أريد هذا CW لأنني أريد التأكد من أن الملصق يحصل على رصيد كامل لما آمل فيه رد mod_rewrite لإنهاء جميع الأسئلة mod_rewrite. - Kyle Brandt♦
عذرا ، أنا upvoted السؤال. ؛-) أعتقد حقا أنه يجب أن تظهر في (أو بالقرب) من قمة mod-rewrite البحث عن العلامات / الفلاتر. - Steven Monday
يجب على شخص آخر (tm) التعامل مع حالات الاستخدام الشائعة. لا أعرفهم جيدًا بما فيه الكفاية لتحقيق العدالة. - sysadmin1138♦
ربما يجب ربط هذا السؤال بعلامة ww-modw rewrite لجعل المسار أقصر. - beldaz


الأجوبة:


ترتيب صيغة mod_rewrite

يحتوي mod_rewrite على بعض قواعد ترتيب محددة تؤثر على المعالجة. قبل أن يتم أي شيء ، فإن RewriteEngine On يجب إعطاء التوجيه لأن هذا يؤدي إلى تشغيل mod_rewrite. يجب أن يكون هذا قبل أي توجيهات أخرى لإعادة الكتابة.

RewriteCond سابق RewriteRule يجعل هذه القاعدة خاضعة لشروط. ستتم معالجة أي من عمليات RewriteRules التالية كما لو أنها لا تخضع لشروط.

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html

في هذه الحالة البسيطة ، إذا كان مُحيل HTTP من serverfault.com ، فأعد توجيه طلبات المدونة إلى صفحات خادم خادم خاص (نحن فقط ذلك النوع الخاص). ومع ذلك ، إذا كان لدى الكتلة أعلاه خط RewriteRule إضافي:

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule $/blog/(.*)\.html        $/blog/$1.sf.html
RewriteRule $/blog/(.*)\.jpg         $/blog/$1.sf.jpg

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

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

ولكن ربما ينبغي القيام به مع بعض بناء الجملة استبدال أصعب.

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

يحتوي RewriteRule الأكثر تعقيدًا على الشروط الشرطية للمعالجة. آخر بين قوسين ، (html|jpg) يروي RewriteRule للمباراة سواء html أو jpg، ولتمثيل السلسلة المطابقة بـ $ 2 في السلسلة المعاد كتابتها. هذا متطابق منطقيا مع الكتلة السابقة ، مع اثنين من أزواج RewriteCond / RewriteRule ، فإنه يفعل ذلك على خطين بدلا من أربعة.

تكون خطوط RewriteCond المتعددة مضمنة ضمنيًا ، ويمكن أن تكون صريحة ORed. لمعالجة المُحيلين من كل من ServerFault و Super User (صريح OR):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)    [OR]
RewriteCond %{HTTP_REFERER}                ^https?://superuser\.com(/|$)
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

لخدمة الصفحات المحولة على ServerFault باستخدام متصفحات Chrome (ضمنيًا AND):

RewriteEngine On
RewriteCond %{HTTP_REFERER}                ^https?://serverfault\.com(/|$)
RewriteCond %{HTTP_USER_AGENT}             ^Mozilla.*Chrome.*$
RewriteRule ^/blog/(.*)\.(html|jpg)        /blog/$1.sf.$2

RewriteBase هو أيضا أمر محدد لأنه يحدد كيفية اتباعها RewriteRule توجيهات معالجة معالجتها. انها مفيدة جدا في ملفات htaccess. إذا تم استخدامه ، فيجب أن يكون أول توجيه تحت عنوان "RewriteEngine on" في ملف .htaccess. خذ هذا المثال:

RewriteEngine On
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

هذا يخبر mod_rewrite أن عنوان URL المحدد الذي يتم التعامل معه حاليًا قد تم التوصل إليه عن طريق http://example.com/blog/ بدلاً من مسار الدليل الفعلي (/ home / $ Username / public_html / blog) ومعالجتها وفقًا لذلك. وبسبب هذا ، فإن RewriteRule ترى أنها بداية السلسلة لتكون بعد "/ blog" في عنوان URL. هنا هو نفس الشيء كتابة طريقتين مختلفتين. واحد مع RewriteBase ، والآخر دون:

RewriteEngine On

##Example 1: No RewriteBase##
RewriteCond %{HTTP_REFERER}                                   ^https?://serverfault\.com(/|$)
RewriteRule /home/assdr/public_html/blog/(.*)\.(html|jpg)     $1.sf.$2

##Example 2: With RewriteBase##
RewriteBase /blog
RewriteCond %{HTTP_REFERER}           ^https?://serverfault\.com(/|$)
RewriteRule ^(.*)\.(html|jpg)         $1.sf.$2

كما ترى، RewriteBase يسمح بإعادة كتابة القواعد لزيادة فعالية الويبموقع مسار للمحتوى بدلا من الويبالخادم، والتي يمكن أن تجعلها أكثر وضوحا لأولئك الذين يقومون بتحرير مثل هذه الملفات. أيضا ، يمكنهم جعل التوجيهات أقصر ، والتي لها جاذبية جمالية.


RewriteRule مطابقة الجملة

يحتوي RewriteRule نفسه على بناء معقد للسلاسل المطابقة. سأغطي الأعلام (أشياء مثل [PT]) في قسم آخر. لأن Sysadmins تتعلم من خلال المثال أكثر من مجرد قراءة رجل الصفحات سوف أقدم أمثلة وشرح ما يفعلونه.

RewriteRule ^/blog/(.*)$    /newblog/$1

ال .* بناء يتطابق مع أي حرف واحد (.) صفر أو أكثر من المرات (*). يخبره تضمينه بين قوسين أنه يوفر السلسلة التي تم مطابقتها كمتغير $ 1.

RewriteRule ^/blog/.*/(.*)$  /newblog/$1

في هذه الحالة ، لم يتم تضمين الأول. * في parens ، لذا لا يتم توفيره للسلسلة المعاد كتابتها. تعمل هذه القاعدة على إزالة مستوى الدليل على موقع المدونة الجديد. (/blog/2009/sample.html يصبح /newblog/sample.html).

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$2

في هذه الحالة ، يقوم تعبير قوس الأول بتعيين مجموعة متطابقة. يصبح هذا $ 1 ، وهو غير مطلوب ، وبالتالي لا يستخدم في السلسلة المعاد كتابتها.

RewriteRule ^/blog/(2008|2009)/(.*)$   /newblog/$1/$2

في هذه الحالة ، نستخدم $ 1 في سلسلة إعادة الكتابة.

RewriteRule ^/blog/(20[0-9][0-9])/(.*)$   /newblog/$1/$2

تستخدم هذه القاعدة بنية قوس خاصة تحدد حرفًا ما نطاق. [0-9] يتطابق مع الأرقام من 0 إلى 9. ستتناول هذه القاعدة المحددة السنوات من 2000 إلى 2099.

RewriteRule ^/blog/(20[0-9]{2})/(.*)$  /newblog/$1/$2

هذا يفعل نفس الشيء مثل القاعدة السابقة ، لكن الجزء {2} يخبره بأن يتطابق مع الحرف السابق (تعبير قوس في هذه الحالة) مرتين.

RewriteRule ^/blog/([0-9]{4})/([a-z]*)\.html   /newblog/$1/$2.shtml

ستتطابق هذه الحالة مع أي حرف صغير في التعبير المطابق الثاني ، وتقوم بذلك لعدد أكبر من الأحرف. ال \. بناء يروي لها أن تعامل الفترة على أنها فترة فعلية ، وليس على طابع خاص في الأمثلة السابقة. سوف تنكسر إذا كان اسم الملف يحتوي على شرطات فيه ، رغم ذلك.

RewriteRule ^/blog/([0-9]{4})/([-a-z]*)\.html  /newblog/$1/$2.shtml

هذا يعوض أسماء الملفات مع شرطات فيها. ولكن كما - هو حرف خاص في تعبيرات القوس ، يجب أن يكون أول شخصية في التعبير.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

هذا الإصدار يعوق أي اسم الملف مع الحروف والأرقام أو - شخصية في اسم الملف. هذه هي الطريقة التي تحدد بها مجموعات أحرف متعددة في تعبير قوس.


أعلام RewriteRule

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

RewriteRule ^/blog/([0-9]{4})/([-a-z]*).\html  /newblog/$1/$2.shtml  [L]

العلم هو [L] في نهاية التعبير أعلاه. يمكن استخدام علامات متعددة ، مفصولة بفاصلة. تصف الوثائق المرتبطة كل واحد ، ولكن هنا على أي حال:

L = الأخير. توقف عن معالجة RewrriteRules بمجرد تطابق هذا. ترتيب التهم!
C = سلسلة. متابعة معالجة RewriteRule التالي. إذا لم تتطابق هذه القاعدة ، فلن يتم تنفيذ القاعدة التالية. المزيد عن هذا لاحقا.
E = قم بتعيين متغير بيئي. لدى Apache العديد من المتغيرات البيئية التي يمكن أن تؤثر على سلوك خادم الويب.
F = ممنوع. إرجاع خطأ 403-Forbidden إذا كانت هذه القاعدة متطابقة.
G = ذهب. إرجاع خطأ 410-Gone إذا كانت هذه القاعدة متطابقة.
H = معالج. يفرض الطلب ليتم التعامل معه كما لو كان نوع MIME المحدد.
N = التالي. يفرض على القاعدة البدء من جديد وإعادة المطابقة. كن حذرا! حلقات يمكن أن يؤدي.
NC = لا يوجد يسمح jpg لمطابقة jpg و JPG.
NE = لا مفر. يمنع إعادة كتابة الأحرف الخاصة (.؟ & & # ... & /) في مكافئاتها رمز ست عشري.
NS = لا توجد طلبات فرعية. إذا كنت تستخدم تضمين جانب الخادم ، فسيؤدي ذلك إلى منع التطابقات مع الملفات المضمنة.
P = الوكيل. يفرض التعامل مع القاعدة بواسطة mod_proxy. توفير محتوى من خوادم أخرى بشكل شفاف ، لأن خادم الويب الخاص بك يجلبه ويعيد خدمته. هذا علم خطر ، حيث أن أحدهما مكتوب بشكل سيئ سيحول خادم الويب الخاص بك إلى وكيل مفتوح وذاك سيء.
PT = ممر. تأخذ بعين الاعتبار بيانات الاسم المستعار في مطابقة RewriteRule.
جهاز الإحصاء = QSAppend. عندما تحتوي السلسلة الأصلية على استعلام (http://example.com/thing؟asp=fooإلحاق سلسلة الاستعلام الأصلية إلى السلسلة المعاد كتابتها. عادة ما يتم التخلص منه. مهم للمحتوى الديناميكي.
R = إعادة التوجيه. تقديم إعادة توجيه HTTP إلى عنوان URL المحدد. يمكن أيضًا تقديم شفرة إعادة توجيه دقيقة [R = 303]. تشبه الى حد بعيد RedirectMatch، وهو أسرع ويجب استخدامه عند الإمكان.
S = تخطي. تخطي هذه القاعدة.
تي = اكتب. حدد نوع mime للمحتوى الذي تم ارجاعه. تشبه الى حد بعيد AddType التوجيه.

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

RewriteEngine On
RewriteCond %{HTTP_REFERER}          ^https?://serverfault\.com(/|$)
RewriteRule ^/blog/(.*)\.html        /blog/$1.sf.html     [C]
RewriteRule ^/blog/(.*)\.jpg         /blog/$1.sf.jpg

لأن أول RewriteRule يحتوي على علامة السلسلة ، سيتم تنفيذ القاعدة rewrite الثاني عندما يكون الأول ، وهو عندما يتم مطابقة القاعدة RewriteCond السابقة. مفيد إذا كانت تعبيرات Apache العادية تجعل أدمغتك تؤلمك. ومع ذلك ، فإن أسلوب الكل في واحد الذي أشرت إليه في القسم الأول يكون أسرع من وجهة نظر التحسين.

RewriteRule ^/blog/([0-9]{4})/([-0-9a-zA-Z]*)\.html   /newblog/$1/$2.shtml

يمكن جعل هذا أبسط من خلال الأعلام:

RewriteRule ^/blog/([0-9]{4})/([-0-9a-z]*)\.html   /newblog/$1/$2.shtml   [NC]

أيضاً ، تنطبق بعض العلامات على RewriteCond. جدير بالذكر ، NoCase.

RewriteCond %{HTTP_REFERER}        ^https?://serverfault\.com(/|$)     [NC]

سيطابق "ServerFault.com"


219
2017-12-20 17:44



أحسنت. [حشو] - EEAA
لطيف جدا mod_rewrite و regex التمهيدي. +1. - Steven Monday
من المفيد أحيانا معرفة أن RewriteCond تتم معالجتها بالفعل بعد ال RewriteRule لا يوازيه. قد ترغب في قول "أكثر على ذلك لاحقًا" بالقرب من الجزء العلوي من الصفحة التي تقول "RewriteCond السابق RewriteRule يجعل قاعدة واحدة تخضع إلى الشرطية." قد ترغب في الإشارة إلى أن التعبيرات المنطقية هي تعبيرات عادية متوافقة مع Perl. لديك أيضًا علامة اقتباس أحادية دخيلة في "... تعتبر RewriteRule أنها بداية السلسلة ..." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 لا يطابق أول مكون الدليل - rewriterules الجشع بشكل افتراضي. /.*/(.*) يتطابق مع كل من / 1 / (2) / و / 1/2/3/4/5 / (6) / ، لذلك تحتاج / [^ /] * / لتتطابق فقط مع مسار FIRST مكون. - adaptr
@ sysadmin1138 ، أعتقد أن هذه الإجابة جيدة ولكن يمكن أن يكون أفضل إذا قمت بتوضيح أكثر على الأعلام E و N و NS و P و PT و S مع أمثلة لأن تلك الأعلام لا توضح كيف تعمل وما إلى ذلك. - Pacerier


ما هو الشكل الأساسي و   هيكل قواعد mod_rewrite؟

سوف أرجع إلى جواب sysadmin1138 الممتاز في هذه النقاط.

ما شكل / نكهة منتظمة   تعبيرات أحتاج إلى أن يكون لها صلبة   قبضة؟

بالإضافة إلى ترتيب بناء الجملة ، مطابقة التطابق / العادي ، وعلامات RewriteRule التي تم تحديدها بواسطة sysadmin1138 ، أعتقد أنه من المفترض أن mod_rewrite يعرّف متغيرات بيئة Apache استنادًا إلى رؤوس طلب HTTP وتكوين Apache.

أوصي Ask_pache's mod_rewrite Debug Tutorial للحصول على قائمة شاملة للمتغيرات التي قد تكون متاحة ل mod_rewrite.

ما هي الاكثر شيوعا   الأخطاء / المزالق عند كتابة الكتابة   قواعد؟

معظم المشاكل مع RewriteRule تنبع من سوء فهم بناء جملة / فشل PCRE للتخلص بشكل صحيح من الحروف الخاصة أو عدم وجود نظرة ثاقبة على محتوى المتغير (المتغيرات) المستخدم في المطابقة.

المشاكل النموذجية واستكشاف الأخطاء وإصلاحها الموصى بها:

  • 500 - خطأ خادم داخلي - قم بإزالة عناصر تحكم نقل Windows في ملف (ملفات) التهيئة إذا كان موجودًا ، تأكد من تمكين mod_rewrite (توجيهات التفاف في IfModule مشروط لتجنب هذا السيناريو) ، والتحقق من صيغة التوجيه ، والتعليق خارج التوجيهات حتى يتم تحديد المشكلة
  • إعادة توجيه حلقة - استفد من RewriteLog و RewriteLogLevel ، قم بالتعليق على التوجيهات حتى يتم التعرف على المشكلة

ما هي طريقة جيدة للاختبار و   التحقق من قواعد mod_rewrite؟

أولاً ، انظر إلى محتويات متغير (متغيرات) البيئة الذي تخطط لمطابقته - إذا كان لديك PHP مثبتًا ، فهذا بسيط مثل إضافة الحظر التالي إلى التطبيق الخاص بك:

<?php
  var_dump($_SERVER);
?>

... ثم اكتب القواعد (يفضل اختبارها على خادم تطوير) ولاحظ أي تطابق أو نشاط غير متناسق في أباتشي ErrorLog ملف.

لمزيد من القواعد المعقدة ، استخدم mod_rewrite RewriteLog التوجيه لتسجيل النشاط إلى ملف وتعيين RewriteLogLevel 3

هل هناك SEO أو أداء   الآثار المترتبة على قواعد mod_rewrite أنا   يجب أن تكون على علم؟

AllowOverride all يؤثر على أداء الخادم كما يجب التحقق من Apache .htaccess توجيهات الملفات والتحالفات مع كل طلب - إذا أمكن ، احتفظ بجميع التوجيهات في تهيئة VirtualHost لموقعك أو تمكينها .htaccess يتجاوز فقط للدلائل التي تحتاج إليها.

غوغل إرشادات مشرفي المواقع صراحةً: "لا تخدع المستخدمين أو تعرض محتوى مختلفًا على محركات البحث أكثر مما تعرضه للمستخدمين ، والذي يشار إليه عادة باسم" الحجب ". - تجنب إنشاء أوامر mod_rewrite التي تعمل على تصفية برامج روبوت محركات البحث.

تفضل روبوتات محركات البحث محتوى 1: 1: تعيين URI (هذا هو الأساس لترتيب الروابط إلى المحتوى) - إذا كنت تستخدم mod_rewrite لإنشاء عمليات إعادة توجيه مؤقتة أو كنت تخدم نفس المحتوى تحت عناوين URI متعددة ، فكر في تحديد URI الكنسي داخل مستندات HTML الخاصة بك.

هل هناك مواقف مشتركة فيها   قد يبدو mod_rewrite مثل اليمين   أداة لهذا المنصب ولكن أليس كذلك؟

هذا موضوع ضخم (وربما مثير للجدل) في حد ذاته - أفضل (IMHO) لمعالجة الاستخدامات على أساس كل حالة على حدة والسماح للمسؤولين بتحديد ما إذا كانت القرارات المقترحة مناسبة لاحتياجاتهم.

ما هي بعض الأمثلة الشائعة؟

Ask_pache's mod_rewrite الحيل والنصائح يغطي فقط كل حالة استخدام مشتركة تنبثق بانتظام ، ومع ذلك ، قد يعتمد الحل "الصحيح" لمستخدم معين على مدى تطور تكوين المستخدم والتوجيهات الحالية (وهذا هو السبب في أنها فكرة جيدة بشكل عام لمعرفة أي آخر توجيهات المستخدم في مكان كلما طرح سؤال mod_rewrite).


38
2017-12-21 01:00



شكرا على الرابط AskApache. هذا ما كنت أبحث عنه! - sica07
مهرج AskApache غير معتمد رسميًا بواسطة ASF. كثير من ما يقوله هو جدل أو خطأ واضح. - adaptr
adaptr الرجاء مشاركة الموارد المتفوقة التي تعرفها على ما يبدو. - danlefree
"المواقف الشائعة التي قد يبدو فيها mod_rewrite كالأداة المناسبة للمهمة ولكن ليس كذلك؟" - بسيط عمليات إعادة التوجيه ، حيث لا يتم استخدام mod_rewrite بالفعل. استخدم mod_alias Redirect أو RedirectMatch في حين أن. انظر أيضًا مستندات Apache: عندما لا تستخدم mod_rewrite - MrWhite


مثل العديد من المشرفين / المطورين لقد كنت أقاتل تعقيدات إعادة كتابة القواعد لسنوات وأنا غير راض عن وثائق أباتشي الحالية ، لذلك قررت كمشروع شخصي للوصول إلى قاع كيف mod_rewrite يعمل بالفعل ويتفاعل مع بقية نواة أباتشي ، لذلك على مدى الأشهر القليلة الماضية كنت صك اختبار الحالات مع strace + حفر في شفرة المصدر للحصول على مقبض على كل هذا.

في ما يلي بعض التعليقات الأساسية التي تعيد كتابة مطورو القواعد التي يجب وضعها في الاعتبار:

  • بعض جوانب إعادة الكتابة شائعة في تهيئة الخادم ، والمضيف الظاهري ، والدليل ، ومعالجة .htaccess ومع ذلك
  • بعض المعالجة مختلفة جدًا عن تكوين الجذر (تكوين الخادم والمضيف الظاهري والدليل) بدلاً من PerDir (.htaccess) معالجة.
  • الأسوأ من ذلك لأن معالجة PerDir يمكن أن تسبب بشكل عشوائي تقريبًا DRED REDIRECT ، يجب كتابة عناصر تكوين الجذر على علم بأن معالجة PerDir هذه يمكن أن تؤدي إلى ذلك.

أود أن أذهب إلى fas ليقول أنه بسبب هذا ، فإنك تحتاج تقريبًا إلى إعادة كتابة مجموعات المستخدمين إلى فئتين وتعاملهم على أنها منفصلة تمامًا:

  • تلك مع وصول الجذر إلى التكوين أباتشي. هذه هي عادةً admin / developer مع خادم مخصص للتطبيق / VM ، والرسالة هنا بسيطة للغاية: تجنب الاستخدام .htaccess الملفات إن أمكن ؛ تفعل كل شيء في الخادم الخاص بك أو التكوين vhost. التصحيح سهل للغاية حيث يمكن للمطور تعيين التصحيح ولديه حق الوصول إلى ملفات rewrite.log.

  • مستخدمو خدمة مستضافة مشتركة (SHS).

    • هؤلاء المستخدمين يملك ليستخدم .htaccess / معالجة Perdir لأنه لا يوجد بديل المتاحة.
    • الأسوأ من ذلك ، فإن مستوى مهارة هؤلاء المستخدمين (بقدر ما يستخدمون منطق سلم modge-rdx) ، يكون بشكل عام أقل بكثير من المدراء المتمرسين.
    • لا يقدم Apache وموفرو الاستضافة أي دعم في تصحيح الأخطاء / التشخيص. المعلومات التشخيصية الوحيدة هي إعادة توجيه ناجحة ، إعادة توجيه إلى URI غير صحيح. أو رمز حالة 404/500. هذا يتركهم مرتبكين وعاجزين.
    • أباتشي ضعيفة للغاية تشرح كيفية عمل إعادة الكتابة لحالة الاستخدام هذه. على سبيل المثال لا يقدم شرح واضح لما PerDir .htaccessتم اختيار الملف ولماذا. لا يفسر تعقيدات PerDir الدراجات وكيفية تجنب ذلك.

من المحتمل أن يكون هناك مجتمع ثالث: الموظفون الإداريون والمشرفون في مقدمي خدمات الدعم الصحي الذين ينتهي بهم المطاف بالقدم في كلا المعسكرين ويتعين عليهم أن يعانوا من عواقب ما سبق.

لقد كتبت عددًا من مشاركات المدونات على غرار المقالات (على سبيل المثال ، المزيد عن استخدام قواعد Rewrite في ملفات htaccess) التي تغطي الكثير من النقاط التفصيلية التي لن أكررها هنا للحفاظ على هذا المنشور قصيرًا. لدي خدمة مشتركة خاصة بي بالإضافة إلى دعم بعض مشاريع FLOSS المخصصة و VM. لقد بدأت باستخدام معيار LAMP VM كأداة اختبار لحساب SHS الخاص بي ، ولكن في النهاية وجدت أنه من الأفضل عمل مرآة VM مناسبة (موصوفة هنا).

ومع ذلك ، من حيث كيفية دعم مجتمع الإدارة .htaccess يشعرون أننا بحاجة إلى التطوير وتقديم:

  • وصف متماسك لكيفية عمل نظام إعادة الكتابة بالفعل في معالجة PerDir
  • مجموعة من الإرشادات / أفضل الممارسات حول كيفية الكتابة .htaccess إعادة كتابة القواعد
  • بسيطة على شبكة الإنترنت إعادة كتابة محلل البرنامج النصي نوع مماثل لمحللي W3C أتش تي أم أل ، ولكن التي يمكن للمستخدمين إدخال اختبار URIs أو ناقلات الاختبار من نفس والحصول على سجل فوري لإعادة تدفق المنطق /
  • تلميحات حول كيفية الحصول على تشخيصات مضمّنة من قواعدك (على سبيل المثال ،

    • استعمال [E=VAR:EXPR] استغلال حقيقة ذلك EXPR سيتم توسيع backreferences ($ N أو٪ N) لإتاحتها كتشخيصات للبرنامج النصي الهدف.
    • إذا كنت تقوم بترتيب قواعد إعادة الكتابة موضعيا باستخدام علامات [OR] و [C] و [SKIP] و [L] حتى يعمل مخطط إعادة الكتابة بالكامل بدون الحاجة إلى استغلال إعادة التوجيه الداخلية ، ثم يمكنك إضافة ما يلي كقاعدة 1 لتجنب كل متاعب التكرار:

      RewriteCond %{ENV:REDIRECT_STATUS} !=""
      RewriteRule .  -  [L]
      

21
2018-01-14 16:50



هذا موثق جيدا. لماذا تقول أن الوثائق لا تفسر هذا؟ - adaptr
كل ما عليك القيام به هو الاشتراك في .htaccess الموضوعات وسترى. معظم المبتدئين يختلط عليهم - معظمهم لديهم خبرة أولية في خدمة LAMP و mod_rewrite في خدمة مشتركة وبالتالي ليس لديهم وصول جذر إلى تهيئات النظام / vhost ويجب عليهم استخدام كل معالجة dir .htaccessالملفات. هناك اختلافات مهمة يجب على المبتدئ "أن ينزف منها". أنا أعتبر نفسي كمستخدم للطاقة وأنا لا أزال أكتشف الخفايا. كما قلت لقد اضطررت إلى استخدام الفحص ومسح رمز المصدر للعمل بعض الجوانب.ولست بحاجة إلى ذلك. :-( - TerryE
انا موافق تماما. "نحتاج إلى تقسيم مجتمعات المستخدمين لإعادة كتابتها إلى فئتين ونعاملها على أنها منفصلة تمامًا." بعض المستخدمين يستخدمون استضافة مشتركة و بحاجة إلى ليعتمد على .htaccess، وهو هش للغاية ، ومعقد ، ومربك ، حتى بالنسبة للخبراء. لا زلت أواجه مشكلة. - Ryan


باستخدام rewritemap

هناك الكثير من الأشياء التي يمكنك القيام بها مع rewritemaps. الحصول على تصريح باستخدام خوارزمية Rewritemap ، ويمكن استخدامها بعد ذلك في تقييم RewritCond ، وفي RewriteRule Subsitutions.

البنية العامة لـ RewriteMap هي:

RewriteMap MapName MapType:MapSource

فمثلا:

RewriteMap examplemap txt:/path/to/file/map.txt

يمكنك بعد ذلك استخدام اسم الخريطة للبنى مثل:

${examplemap:key}

تحتوي الخريطة على أزواج مفاتيح / قيم. إذا تم العثور على المفتاح ، فسيتم تقسيم القيمة. الخرائط البسيطة هي مجرد ملفات نصية عادية ، ولكن يمكنك استخدام خرائط التجزئة ، وحتى استعلامات SQL. المزيد من التفاصيل موجودة في المستندات:

http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap

سلاسل غير متوقعة.

هناك أربعة خرائط داخلية يمكنك استخدامها للقيام ببعض التلاعب. سلاسل خاصة لا يمكن أن تأتي في متناول اليدين.

على سبيل المثال: أريد اختبار السلسلة "café" في سلسلة الاستعلام. ومع ذلك ، فإن المتصفح سيخرج من هذا قبل إرساله إلى الخادم الخاص بي ، لذلك سأكون بحاجة إلى معرفة ما هو إصدار عنوان URL المتسرب لكل سلسلة أرغب في مطابقتها ، أو يمكنني إلغاء تصفُّحها فقط ...

RewriteMap unescape int:unescape

RewriteCond %{QUERY_STRING}  (location|place)=(.*)
RewriteCond ${unescape:%2}   café
RewriteRule ^/find/$         /find/1234? [L,R]

لاحظ كيف يمكنني استخدام RewriteCond واحد فقط لالتقاط الوسيطة إلى مقدمة معلمة سلسلة الاستعلام ، ثم استخدم الخريطة في rewriteCond الثاني لإلغاء حظره. هذا ثم يحصل مقارنة. لاحظ أيضًا كيف أحتاج إلى٪ 2 كمفتاح في rewritemap ، حيث إن٪ 1 سيحتوي إما على "الموقع" أو "المكان". عندما تستخدم الأقواس لأنماط المجموعات ، سيتم التقاطها أيضًا ، إذا كنت تخطط لاستخدام نتيجة الالتقاط أو لا ...


15
2018-04-06 11:57



الجملة الأخيرة ليست صحيحة تماما. ال mod_rewrite محرك regexp يدعم مجموعات غير أسر مثل (?:location|place) وهذا سيكون فقط التقاط واحد في المثال. - TerryE


ما هي الاكثر شيوعا   الأخطاء / المزالق عند كتابة الكتابة   قواعد؟

يقع الفشل السهل عندما تعيد كتابة عناوين URL التي تغيّر المسار الظاهر ، على سبيل المثال ، من عند /base/1234/index.html إلى /base/script.php?id=1234. لن يتمكن العميل من العثور على أي صور أو CSS ذات المسارات النسبية إلى موقع البرنامج النصي. يمكن العثور على عدد من الخيارات لحل هذه المشكلة هذا السؤال.


12
2018-01-01 04:02



شكرا على الرابط. لا سيما عند العمل مع أعضاء الفريق الآخرين الذين ليسوا على دراية بإعادة الكتابة ، أجد إضافة أ <base> لتكون أكثر سهولة في المتابعة وما زالت تمكّن المسارات ذات الصلة. - kontur