שאלה הפניה, שינוי כתובות אתרים או להפנות HTTP ל HTTPS ב Apache - כל מה שאתה רוצה לדעת על כללים Mod_Rewrite אבל חששו לשאול


זה קנוניקל שאלה על הדוגמה של אפאצ'י.

שינוי כתובת אתר של בקשה או הפניית משתמשים לכתובת אתר שונה מזו שביקשו במקור נעשה באמצעות mod_rewrite. זה כולל דברים כגון:

  • שינוי HTTP ל- HTTPS (או להיפך)
  • שינוי בקשה לדף שאינו קיים עוד להחלפה חדשה.
  • שינוי פורמט כתובת אתר (כגון id = 3433 אל / id / 3433)
  • הצגת דף אחר המבוסס על הדפדפן, על פי המפנה, על בסיס כל דבר אפשרי תחת הירח והשמש.
  • כל מה שאתה רוצה להתעסק עם כתובת האתר

כל מה שאתה רוצה לדעת על כללים Mod_Rewrite אבל היו מפחדים לשאול!

איך אני יכול להיות מומחה לכתיבת כללי mod_rewrite?

  • מהו המבנה הבסיסי והמבנה של כללים mod_rewrite?
  • איזה צורה / טעם של ביטויים רגולריים אני צריך כדי לקבל אחיזה מוצקה של?
  • מה הן השגיאות הנפוצות ביותר / החסרונות בעת כתיבת הכללים לשכתב?
  • מהי שיטה טובה לבדיקה ואישור כללים mod_rewrite?
  • האם יש SEO או ביצועים ההשלכות של כללים mod_rewrite אני צריך להיות מודע?
  • האם יש מצבים נפוצים שבהם mod_rewrite אולי נראה כמו הכלי הנכון עבור העבודה, אבל לא?
  • מהן דוגמאות נפוצות?

מקום לבדוק את הכללים שלך

ה בודק htaccess אתר אינטרנט הוא מקום נהדר לשחק עם הכללים שלך ולבדוק אותם. זה אפילו מראה את התפוקה debug כך שתוכל לראות מה מתאים ומה לא.


257
2017-12-20 16:59




הרעיון מאחורי השאלה הזאת הוא לתת נתיב קרוב לכל השאלות mod_rewrite אינסופית כי הכונן שלנו משתמשים רגילים יותר משוגע. זה דומה מאוד מה נעשה עם subnetting ב serverfault.com/questions/49765/how-does-subnetting-work . - Kyle Brandt♦
כמו כן, אני לא באמת רוצה יותר מדי upvotes על זה שאלה, אלא הם צריכים ללכת על התשובה. אני לא רוצה CW זה כי אני רוצה לוודא את פוסטר מקבל אשראי מלא על מה אני מקווה הוא תשובה לתשובה עד סוף כל השאלות mod_rewrite. - Kyle Brandt♦
מצטער, אני upvoted את השאלה. ;-) אני באמת חושב שזה צריך להופיע ליד (או ליד) החלק העליון של mod-rewrite חיפוש תגים / מסננים. - Steven Monday
מישהו אחר (tm) צריך לטפל במקרים נפוצים. אני לא מכיר אותם מספיק כדי לעשות את זה צדק. - sysadmin1138♦
אולי שאלה זו צריכה להיות מקושרת לתוך mod-rewrite תג ויקי כדי להפוך את הנתיב אפילו קצר יותר. - beldaz


תשובות:


סדר תחביר

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, להפנות בקשות הבלוג דפי serverfault מיוחד (אנחנו פשוט מיוחדים). עם זאת, אם לחסום שלמעלה היה קו 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 מרובים הם ANDED במרומז, וניתן ORed במפורש. כדי לטפל במפיצים ממשתמשי ServerFault ו- Super (מפורשים 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 (מרומזים):

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 ב" בקובץ. HTaccess. קח לדוגמה זו:

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

זה אומר mod_rewrite כי כתובת אתר מסוימת זה כרגע הטיפול הגיע דרך http://example.com/blog/ במקום נתיב הספרייה הפיזית (/ home / $ username / public_html / blog) וכדי לטפל בו בהתאם. בגלל זה, RewriteRule רואה שזה מחרוזת להתחיל להיות אחרי "/ blog" בכתובת האתר. הנה אותו הדבר כתוב בשתי דרכים שונות. אחד עם 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 מאפשר לשכתב כללים למנף את האינטרנט,אתר נתיב לתוכן ולא באינטרנט,שרת, אשר יכול להפוך אותם מובנת יותר למי לערוך קבצים כאלה. כמו כן, הם יכולים להפוך את ההוראות קצר יותר, אשר יש ערעור אסתטי.


תחביר תואם RevriteRule

ל- 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-299.

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

זה עושה את אותו הדבר כמו הכלל הקודם, אבל החלק {2} אומר את זה כדי להתאים את התו הקודם (ביטוי סוגר במקרה זה) פעמיים.

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

מקרה זה יתאים לכל אות באותיות קטנות יותר בביטוי ההתאמה השני, ועשה זאת עבור תווים רבים ככל האפשר. ה \. build אומר את זה כדי להתייחס לתקופה כמו תקופה בפועל, לא אופי מיוחד זה בדוגמאות קודמות. זה יהיה לשבור אם שם הקובץ יש מקפים בו, אם כי.

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 = אחרון. עצור את עיבוד RewriteRules לאחר התאמה זו. ספירת הזמנות!
ג שרשרת. המשך לעיבוד RewriteRule הבא. אם כלל זה אינו תואם, הכלל הבא לא יבוצע. עוד על זה מאוחר יותר.
ה = הגדרת משתנה סביבתי. אפאצ 'י יש משתנים סביבתיים שונים שיכולים להשפיע על התנהגות שרת אינטרנט.
F אסורה. מחזירה שגיאה 403-Forbidden אם כלל זה תואם.
ז נעלם. מחזירה שגיאת 410-Gone אם כלל זה תואם.
ח מטפל =. מאלץ את הבקשה לטפל כאילו היה סוג ה- MIME שצוין.
N 49 Next. מכריח את הכלל להתחיל מחדש ולהתאים מחדש. הזהר! לולאות יכול לגרום.
NC = אין מקרה. מאפשר jpg כדי להתאים הן jpg והן JPG.
NE = אין בריחה. מונע את הכתיבה מחדש של תווים מיוחדים (.? & # וכו ') לתוך מקבילים שלהם קוד hex.
NS = אין תת-תחומים. אם אתה משתמש בצד השרת, זה ימנע התאמות לקבצים הכלולים.
עמ ' פרוקסי =. מאלץ את הכלל לטפל ב- mod_proxy. ספק באופן שקוף תוכן משרתים אחרים, מכיוון ששרת האינטרנט שלך מביא אותו ומשמש אותו מחדש. זהו דגל מסוכן, שכן אחד כתוב גרוע יהפוך את שרת האינטרנט שלך לתוך פרוקסי פתוח וזה רע.
PT לעבור דרך. קח בחשבון כינויים הצהרת התאמת RewriteRule.
QSA = QSAppend. כאשר המחרוזת המקורית מכילה שאילתה (http://example.com/thing?asp=foo) מוסיפים את מחרוזת השאילתה המקורית למחרוזת שנכתבה מחדש. בדרך כלל זה יימחק. חשוב לתוכן דינמי.
R = הפניה מחדש. ספק כתובת אתר להפניה מחדש של HTTP לכתובת האתר שצוינה. ניתן גם לספק קוד הניתוב מחדש מדויק [R = 303]. דומה מאוד ל RedirectMatch, המהיר יותר ויש להשתמש בו במידת האפשר.
S סקי 49 דלג על הכלל הזה.
T 49. ציין את סוג ה- 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 הראשון יש את הדגל שרשרת, השני לשכתב הכלל יהיה לבצע כאשר הראשון עושה, אשר כאשר הכללים RewriteCond הקודם הוא מותאם. שימושי אם ביטויים קבועים של אפאצ'י גורמים נזק למוח. עם זאת, שיטת All-in-one-line אני מצביעים על החלק הראשון הוא מהיר יותר מנקודת מבט של אופטימיזציה.

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 עושה את זה כלל אחד כפוף תנאי." ייתכן שתרצה לציין כי regexes הם פרל תואם ביטויים רגולריים. כמו כן יש לך שקר חיצוני "... RewriteRule רואה את זה מחרוזת להתחיל ..." - Dennis Williamson
RewriteRule ^/blog/.*/(.*)$ /newblog/$1 אינו תואם את ראשון רכיב ספרייה - rewriterules הם חמדן כברירת מחדל. (/ / / / / / / / / / / / / / / / / /, אז אתה צריך / [/ /] * / רק כדי להתאים את הנתיב FIRST רכיב. - adaptr
@ sysadmin1138, אני חושב שתשובה זו טובה אבל זה יכול להיות טוב יותר אם אתה לפרט יותר על דגלים E, N, NS, P, PT, S עם דוגמאות כי הדגלים האלה לא ברור איך הם עובדים וכו ' - Pacerier


מהו פורמט היסוד ו   מבנה כללי mod_rewrite?

אני מוכן לדחות את התשובה המעולה של sysadmin1138 על נקודות אלה.

מה צורה / טעם של קבוע   ביטויים אני צריך להיות מוצק   לתפוס?

בנוסף להזמנת התחביר, התאמת תחביר / ביטויים רגולריים ודגלי RewriteRule המתוארים על-ידי sysadmin1138, אני מאמין שזה מזכיר כי mod_rewrite חושף משתני סביבה של Apache בהתבסס על כותרות בקשות HTTP ותצורה של Apache.

הייתי ממליץ Debug של ModArewrite Debug של AskApache עבור רשימה מקיפה של משתנים אשר עשויים להיות זמינים mod_rewrite.

מה הם הנפוצים ביותר   טעויות / מלכודות בעת כתיבה לכתוב מחדש   כללים?

רוב הבעיות עם RewriteRule של גזע מתוך אי הבנה של תחביר PCRE / כישלון להימלט תווים מיוחדים או חוסר תובנה התוכן של המשתנים (ים) המשמשים להתאמת.

בעיות אופייניות ופתרון בעיות מומלץ:

  • 500 שגיאת שרת פנימית - הסר פקדי גררת Windows בקובץ התצורה (ים) אם קיים, ודא mod_rewrite מאופשר (הוראות לעטוף ב IfModule מותנה כדי למנוע תרחיש זה), לבדוק תחביר הוראה, להגיב על הוראות עד בעיה מזוהה
  • לולאה להפניה מחדש - לעשות שימוש RewriteLog ו RewriteLogLevel, להגיב על הוראות עד הבעיה מזוהה

מהי שיטה טובה לבדיקה   אימות כללים mod_rewrite?

ראשית, להסתכל על התוכן של המשתנה הסביבה (ים) אתה מתכוון להתאים נגד - אם יש לך מותקן PHP, זה פשוט כמו הוספת בלוק הבא ליישום שלך:

<?php
  var_dump($_SERVER);
?>

... ואז לכתוב את הכללים שלך (רצוי לבדיקה על שרת הפיתוח) ולשים לב כל התאמה או פעילות לא עקבית Apache שלך שגיאה קובץ.

עבור כללים מורכבים יותר, השתמש 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 של 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 למעשה עובד אינטראקציה עם שאר הליבה אפאצ 'י, כך במהלך החודשים האחרונים אני כבר instrumenting במקרים מבחן עם strace + קידוח לתוך קוד המקור כדי לקבל להתמודד עם כל זה.

הנה כמה הערות מפתח כי לשכתב כלל מפתחי צריך לשקול:

  • חלק מההיבטים של שכתוב משותפים לתצורת השרת, המארח הווירטואלי, ספריה, עיבוד htaccess למרות זאת
  • עיבוד קצת שונה מאוד עבור תצורת השורש (תצורת שרת, מארח וירטואלי וספרייה) לעומת PerDir (.htaccess) מעבד.
  • גרוע יותר, כי עיבוד PerDir יכול כמעט ללא הבחנה גרירה רכיבה פנימית, אלמנטים שורש תצורה צריך להיות מודעים לכך עיבוד PerDir כזה יכול להפעיל את זה.

הייתי הולך כמו fas לומר כי בגלל זה אתה כמעט צריך לפצל את קהילות לשכתב המשתמש לשתי קטגוריות ולטפל בהם נפרד לחלוטין:

  • אלה עם גישה שורש להגדרת Apache. אלה הם בדרך כלל מנהל / מפתח עם יישום ייעודי שרת / VM, והמסר כאן הוא די פשוט: להימנע משימוש .htaccess קבצים אם בכלל אפשרי; לעשות הכל בשרת או vhost config. Debugging הוא קל יחסית מאז היזם יכול להגדיר באגים ויש לו גישה קבצים rewrite.log.

  • משתמשים בשירות משותף מתארח (SHS).

    • משתמשים כאלה יש להשתמש .htaccess / Perdir עיבוד כמו אין חלופה זמין.
    • גרוע מכך, רמת מיומנות של משתמשים כאלה (ככל השימוש regxp מונע סולם לוגיקה של mod_rewrite) הוא בדרך כלל פחות מאשר מנהלי מנוסה.
    • אפאצ 'י וספקי אירוח לא מציעים תמיכה באגים / אבחון. המידע האבחוני היחיד הוא ניתוב מחדש מוצלח, ניתוב מחדש ל- URI שגוי. או קוד מצב 404/500. זה משאיר אותם מבולבלים וחסרי ישע.
    • אפאצ 'י הוא חלש מאוד להסביר איך שכתוב עובד במקרה זה. לדוגמה, הוא אינו מספק הסבר ברור על מה PerDir .htaccessהקובץ נבחר ומדוע. זה לא מסביר את המורכבויות של רכיבה פרדיר וכיצד להימנע מכך.

יש אולי קהילה שלישית: מנהל ותמיכה צוות של ספקי SHS אשר בסופו של דבר עם רגל בשני המחנות ואת צריכה לסבול את התוצאות של האמור לעיל.

כתבתי כמה פוסטים בבלוג בסגנון סגנון (למשל עוד על שימוש בכללים לשכתב קבצי. HTaccess) אשר מכסה הרבה נקודות מפורטות אשר לא אחזור כאן כדי לשמור על הודעה קצרה. יש לי שירות משותף שלי, כמו גם תמיכה בפרויקטים ייעודיים & VM FLOSS. התחלתי את השימוש VM רגיל LMP ככלי בדיקה עבור חשבון SHS שלי, אבל בסופו של דבר מצאתי את זה יותר טוב לעשות מראה VM ראוי (המתואר כאן).

עם זאת, במונחים של איך הקהילה מנהל צריך לתמוך .htaccess משתמשים, אני מרגיש שאנחנו צריכים לפתח להציע:

  • תיאור קוהרנטי של איך מערכת לשכתב למעשה עובד עיבוד PerDir
  • אוסף של הנחיות / שיטות עבודה מומלצות על איך לכתוב .htaccess לשכתב הכללים
  • פשוט אינטרנט מבוססי לשכתב סקריפט מנתח מעין דומה מנתחי HTML 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 configs ויש להשתמש בכל עיבוד dir דרך .htaccessקבצים. ישנם הבדלים חשובים אשר מתחילים צריך "לדמם מעל". הייתי רואה את עצמי כמשתמש כוח ועדיין מגלה דקויות. כפי שאני sayu הייתי צריך להשתמש strace ו קוד המקור סריקה כדי לחשב כמה היבטים. S צריך להיות נחוץ. :-( - TerryE
אני לגמרי מסכים. "אנחנו צריכים לפצל את קהילות לשכתב משתמש לשתי קטגוריות ולטפל בהם נפרד לחלוטין." משתמשים מסוימים משתמשים אירוח משותף ו צורך להסתמך על .htaccess, שהוא שביר מאוד, מסובך ומבלבל, אפילו למומחים. אני עדיין נתקל בבעיות. - Ryan


שימוש ב- rewritemap

יש הרבה דברים שאתה יכול לעשות עם rewritemaps. Rewritemaps לקבל הכריז באמצעות ההנחיה Rewritemap, ולאחר מכן ניתן להשתמש הן הערכות RewritCond, ו ב RewriteRule subsitutions.

התחביר הכללי עבור RewriteMap הוא:

RewriteMap MapName MapType:MapSource

לדוגמה:

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

לאחר מכן תוכל להשתמש ב- Mapname עבור מבנים כאלה:

${examplemap:key}

המפה מכילה זוגות מפתח / ערך. אם המפתח נמצא, הערך מוחלף. מפות פשוטות הן פשוט קבצי טקסט פשוטים, אבל אתה יכול להשתמש מפות hash, ואפילו שאילתות SQL. פרטים נוספים נמצאים במסמכים:

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

ללא שם: מחרוזות unscaping.

ישנן ארבע מפות פנימיות שבהן ניתן להשתמש כדי לעשות כמה מניפולציות. במיוחד מחרוזות unscaping יכול להיות שימושי.

לדוגמה: אני רוצה לבדוק את המחרוזת "café" במחרוזת השאילתה. עם זאת, הדפדפן יהיה לברוח זה לפני שליחת אותו לשרת שלי, אז אני צריך גם להבין מה כתובת האתר נמלט גירסה היא עבור כל מחרוזת אני רוצה להתאים, או שאני יכול פשוט לפתוח את זה ...

RewriteMap unescape int:unescape

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

שים לב איך אני משתמש אחד RewriteCond פשוט ללכוד את האצבע אצבע פרמטר מחרוזת השאילתה, ולאחר מכן להשתמש במפה ב rewrite השני כדי לבטל את זה. אז זה מקבל לעומת. כמו כן, שים לב איך אני צריך אותנו% 2 כמפתח ב- rewritemap, שכן% 1 יכיל "מיקום" או "מקום". כאשר אתה משתמש בסוגריים לדפוסי הקבוצה הם גם להיות שנתפסו, מזג האוויר אתה מתכוון להשתמש בתוצאה של לכידת או לא ...


15
2018-04-06 11:57



המשפט האחרון הוא לא לגמרי נכון. ה mod_rewrite מנוע regexp תומך שאינם לוכדים קבוצות כגון (?:location|place) וזה יהיה רק ​​ללכוד אחד בדוגמה. - TerryE


מה הם הנפוצים ביותר   טעויות / מלכודות בעת כתיבה לכתוב מחדש   כללים?

מפלה קלה באמת היא בעת כתיבה מחדש של כתובות אתרים שמשנות את הנתיב הנראה לעין, למשל. מ /base/1234/index.html ל /base/script.php?id=1234. כל תמונות או CSS עם נתיבים יחסיים למיקום הסקריפט לא יימצאו על ידי הלקוח. ניתן למצוא מספר אפשרויות לפתרון הבעיה זו FAQ.


12
2018-01-01 04:02



תודה על הקישור. במיוחד כאשר אני עובד עם חברי צוות אחרים שאינם מכירים את שכתוב, אני מוצא הוספת <base> כדי להיות קל ביותר לעקוב ועדיין לאפשר נתיבים יחסית. - kontur