Tampaknya ada beberapa pengguna yang mencari cara menulis ulang URL di h2o. mruby memungkinkan, tetapi tidak jelas caranya. Saya dengan cepat menjelaskan tantangan terbaru saya:
Di server kami, kami harus memetakan string kueri ke file aktual di server; dan ini mungkin termasuk spasi kosong (atau %20 saat dikodekan URL). Sebagai contoh:
example.com/search?item=something%20and%somethingelse harus mendapatkan file
example.com/search/something_and_somethingelse
Saya membaca contoh mruby untuk h2o dan spesifikasi Rack , tetapi saya tidak begitu mengerti apa yang perlu saya tulis untuk memberi tahu h2o untuk menggunakan jalur yang berbeda. Saya dapat membaca variabel lingkungan PATH_INFO dan QUERY_STRING, tetapi bagaimana cara mengomunikasikan nilai baru kembali ke server h2o ("lihat di sini alih-alih di sana")?
Pada catatan terkait, saya menemukan permata yang tampaknya terkenal bernama " rack-rewrite ". Dan saya bertanya-tanya, apakah ini dapat membantu saya dengan aturan penulisan ulang saya, dan bagaimana permata seperti itu dapat digabungkan dengan server h2o saya. Apakah Anda punya contoh di suatu tempat?
Saya dapat membaca variabel lingkungan PATH_INFO dan QUERY_STRING, tetapi bagaimana cara mengomunikasikan nilai baru kembali ke server h2o ("lihat di sini alih-alih di sana")?
Anda harus mengatur reproxy: on
di file konfigurasi Anda dan mengembalikan respons dengan set header x-reproxy-url
. Itu menginstruksikan penangan reproxy untuk mengembalikan konten URL yang ditentukan dengan header.
lihat juga: https://h2o.examp1e.net/configure/mruby_directives.html#delegating -request
Pada catatan terkait, saya menemukan permata yang tampaknya terkenal bernama "rack-rewrite". Dan saya bertanya-tanya, apakah ini dapat membantu saya dengan aturan penulisan ulang saya, dan bagaimana permata seperti itu dapat digabungkan dengan server h2o saya. Apakah Anda punya contoh di suatu tempat?
Rack-rewrite tergantung pada _libraries_ yang disediakan oleh Rack, dan saya khawatir Anda tidak dapat menggunakannya seperti dari mruby (meskipun IMO porting ke mruby tidak akan sulit).
Saya mengerti ada kebutuhan untuk cara yang lebih deklaratif untuk menentukan pengalihan daripada menuliskan aturan menggunakan mruby; akan sangat bagus jika seseorang dapat membuat port untuk penulisan ulang rak atau yang serupa.
Terima kasih banyak! Sekarang saya paham.
Sebagai catatan - dan semua orang mencari sesuatu yang serupa: Bagian berikut dari h2o.conf menggantikan satu ruang kosong dengan garis bawah di semua URL di bawah /test/
Misalnya https://www.example.com/test/something%20and%20somethingelse ditulis ulang menjadi
https://www.example.com/test/something_and_somethingelse
Jika h2o tidak menemukan file yang ditulis ulang, itu secara internal dialihkan ke skrip PHP yang - dalam kasus saya - membuat pencarian dari database untuk mengambil konten yang diinginkan.
"/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
Saya harus mengatakan bahwa menggunakan mruby untuk ini tampaknya sangat membosankan dan rumit bagi seseorang yang berasal dari NGINX.
Komentar yang paling membantu
Saya harus mengatakan bahwa menggunakan mruby untuk ini tampaknya sangat membosankan dan rumit bagi seseorang yang berasal dari NGINX.