يبدو أن هناك عددًا قليلاً جدًا من المستخدمين الذين يبحثون عن كيفية إعادة كتابة عناوين URL في h2o. mruby يجعل ذلك ممكنًا ، لكن ليس من الواضح كيف. أشرح بسرعة التحدي الأخير لي:
على الخادم الخاص بنا ، يتعين علينا تعيين سلاسل الاستعلام للملفات الفعلية الموجودة على الخادم ؛ وقد تتضمن هذه مسافات فارغة (أو٪ 20 عند ترميز URL). على سبيل المثال:
يجب أن يحصل example.com/search؟item=something٪20and٪somethingelse على الملف
example.com/search/something_and_somethingelse
قرأت أمثلة mruby الخاصة بـ h2o ومواصفات Rack ، لكنني لا أفهم تمامًا ما أحتاج إلى كتابته لأخبر h2o باستخدام مسار مختلف. يمكنني قراءة متغيرات البيئة PATH_INFO و QUERY_STRING ، ولكن كيف يمكنني توصيل القيم الجديدة إلى خادم h2o ("انظر هنا بدلاً من هناك")؟
في ملاحظة ذات صلة ، وجدت جوهرة تبدو معروفة جيدًا تسمى " إعادة كتابة الرف ". وكنت أتساءل ، إذا كان هذا قد يساعدني في قواعد إعادة الكتابة الخاصة بي ، وكيف يمكن دمج هذه الأحجار الكريمة مع خادم h2o الخاص بي. هل لديك مثال في مكان ما؟
يمكنني قراءة متغيرات البيئة PATH_INFO و QUERY_STRING ، ولكن كيف يمكنني توصيل القيم الجديدة إلى خادم h2o ("انظر هنا بدلاً من هناك")؟
يجب عليك تعيين reproxy: on
في ملف التكوين الخاص بك وإرجاع استجابة مع مجموعة x-reproxy-url
. هذا يوجه معالج reproxy لإرجاع محتويات عنوان URL المحدد بالرأس.
انظر أيضًا: https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request
في ملاحظة ذات صلة ، وجدت جوهرة تبدو معروفة جيدًا تسمى "إعادة كتابة الرف". وكنت أتساءل ، إذا كان هذا قد يساعدني في قواعد إعادة الكتابة الخاصة بي ، وكيف يمكن دمج هذه الأحجار الكريمة مع خادم h2o الخاص بي. هل لديك مثال في مكان ما؟
تعتمد إعادة كتابة الحامل على _libraries_ التي يوفرها Rack ، وأخشى أنه لا يمكنك استخدامها كما هي من mruby (على الرغم من أن نقلها إلى mruby لن يكون صعبًا من قبل IMO).
أفهم أن هناك حاجة إلى طريقة أكثر وضوحًا لتحديد عمليات إعادة التوجيه بدلاً من كتابة القواعد باستخدام mruby ؛ سيكون من الرائع أن يأتي شخص ما بمنفذ لإعادة الكتابة على الرف أو شيء مشابه.
شكرا جزيلا لك! الان فهمت.
للسجل - وكل من يبحث عن شيء مشابه: يستبدل الجزء التالي من h2o.conf مساحة فارغة واحدة بشرطة سفلية في جميع عناوين URL تحت / test /
على سبيل المثال ، تمت إعادة كتابة https://www.example.com/test/something٪20and٪20somethingelse إلى
https://www.example.com/test/something_and_somethingelse
إذا لم يعثر h2o على الملف المعاد كتابته ، فإنه يعيد التوجيه داخليًا إلى نص PHP والذي - في حالتي - يقوم بالبحث من قاعدة بيانات لجلب المحتوى المطلوب.
"/test":
reproxy: ON
mruby.handler: |
lambda do |env|
if /^\/([^ ]+[ ][^ ]+)/.match(env["PATH_INFO"]) # All URLs with at least one empty space NOT in the beginning or end
str = "#{$1}"
str = str.gsub( %r{[ ]}, '_') # replace every single empty space with an underscore
return [307, {"x-reproxy-url" => "https://www.example.com/test/#{str}"}, []] # reproxy to rewritten URL
end
return [399, {}, []]
end
file.dir: "/usr/local/www/apache22/data/test/json" # serve static files if found
redirect: # if not found, internally redirect to /test/index.php/<path>
url: /test/index.php/
internal: YES
status: 307
لا بد لي من أن أقول إن استخدام mruby لهذا يبدو مملاً للغاية ومعقدًا لشخص قادم من NGINX.
التعليق الأكثر فائدة
لا بد لي من أن أقول إن استخدام mruby لهذا يبدو مملاً للغاية ومعقدًا لشخص قادم من NGINX.