Rumah  >  Soal Jawab  >  teks badan

Apache 2.4 URL 重写:/server/?Server=ServerName 至 /server/ServerName

Saya cuba menghantar URL dari parameter /server/?Server=ServerName 重写为 /server/ServerName,以便 ServerName ke PHP.

Saya kini mempunyai ini dalam fail .htaccess saya:

RewriteEngine on
RewriteBase /
RewriteCond %{QUERY_STRING} Server=([^&]+)
RewriteRule "^server/$" "/server/%1/?"

Apabila cuba melihat /server/ServerName/server/?Server=ServerName, saya mendapat ralat 404.

Ini ialah log tulis semula saya:

init rewrite engine with requested uri /server/
pass through /server/
strip per-dir prefix: C:/wamp64/www/server/ -> server/
applying pattern '^server/$' to uri 'server/'
RewriteCond: input='Server=ServerName' pattern='Server=([^&]+)' => matched
rewrite 'server/' -> '/server/ServerName/?'
split uri=/server/ServerName/? -> uri=/server/ServerName/, args=<none>
trying to replace prefix C:/wamp64/www/ with /
trying to replace context docroot C:/wamp64/www with context prefix 
internal redirect with /server/ServerName/ [INTERNAL REDIRECT]

Pada ketika ini, saya memerlukan sedikit bimbingan kerana saya kecewa dan saya rasa saya kehilangan satu perkara yang mudah.

Saya cuba melaraskan:

Saya juga telah mengkaji untuk menulis semula kod untuk mencuba dan melihat sama ada ia benar-benar menulis semula.

Menggunakan kod di bawah saya berjaya mengalihkan direktori /test2/ 重写为 /server/?Server=ServerName dan halaman dimuatkan dengan baik, jadi saya tahu modul itu aktif dan berjalan.

RewriteRule ^test2/$ /server/?Server=ServerName [PT,L,R=301]

Cuba buat perubahan ini tanpa berjaya. URL tidak akan ditulis semula, tetapi halaman akan dimuatkan. Apache 2.4 .htaccess penulisan semula URL mesra

RewriteRule ^server/([^/\.]+)/?$ /server/?Server=? [L]

P粉038161873P粉038161873251 hari yang lalu382

membalas semua(1)saya akan balas

  • P粉182218860

    P粉1822188602024-01-17 13:48:59

    Nampaknya anda menuju ke arah yang salah. /server/ServerName,因此在内部将请求从 /server/ServerName 重写为 /em> /server/index.php?Server=ServerName (请注意添加 index.php,如注释中所述)。 /server/index.php?Server=ServerName dalam sumber HTML yang anda patut pautkan ialah laluan fail asas (tersembunyi) yang sebenarnya mengendalikan permintaan.

    Walaupun anda seperti telah menyebutnya di baris terakhir...

    URL mesti ditulis semula, jika tidak halaman tidak akan dimuatkan. Mungkin terdapat kekeliruan tentang apa sebenarnya "tulisan semula". Ini tidak mengubah URL. Anda tidak menggunakan .htaccess untuk menukar URL. Anda mesti menukar URL secara manual dalam sumber HTML - URL yang ingin anda pautkan.

    Jika anda mahu, anda boleh (sebagai pilihan) melaksanakan "ubah hala" luaran kemudian - ini memang menukar URL. Tetapi ini hanya untuk mengubah hala enjin carian dan pihak ketiga yang mungkin memaut atau mengindeks URL lama. Jadi, ini adalah untuk SEO, bukan untuk menjadikan aplikasi anda "berfungsi".

    Jadi, secara ringkasnya, dalam susunan ini:

    1. Tukar URL dalam kod sumber HTML untuk memaut ke /server/ServerName URL berformat.
    2. (Pilihan) Jika anda menukar struktur URL sedia ada, ubah hala sebarang permintaan terus ke /server/?Server=ServerName (atau /server/index.php?Server= ServerName< /code >) kepada /server/?Server=ServerName (或 /server/index.php?Server=ServerName< /code>) 到 /server/ServerName (URL kanonik).
    3. Secara dalaman menulis semula permintaan daripada /server/ServerName(规范 URL/您要链接到的 URL)重写为 /server/index.php?Server=ServerName (URL berkanun/URL yang anda mahu pautkan) ke /server/index.php?Server=ServerName (fail asas yang mengendalikan permintaan).

    Dalam akar .htaccess fail:

    RewriteEngine On
    
    # (OPTIONAL) For SEO, if changing an existing URL structure...
    # Redirect "/server/?Server=ServerName" to "/server/ServerName"
    RewriteCond %{QUERY_STRING} ^Server=([^&./]+)(&|$) [NC]
    RewriteRule ^server/(index\.php)?$ /server/%1 [NE,R=301,L]
    
    # Rewrite request from "/server/ServerName" to "/server/index.php?Server=ServerName"
    RewriteRule ^server/([^/.]+)$ server/index.php?Server= [END]

    Ini mengandaikan anda menggunakan Apache 2.4 untuk boleh menggunakan bendera END dalam peraturan terakhir. Ini mengelakkan daripada perlu mempunyai syarat tambahan dalam peraturan pertama yang menyemak permintaan langsung dan bukannya permintaan "ditulis semula" (untuk mengelakkan gelung ubah hala).

    Dalam peraturan pertama ("Redirect"), bahagian index.php adalah pilihan. Rujukan balik %1 mengandungi nilai parameter URL Server yang ditangkap dalam index.php 部分是可选的。 %1 反向引用包含在前面的条件中捕获的Server URL 参数的值。 Servercondition

    sebelumnya. Parameter URL Server mestilah tidak kosong dan tidak mengandungi titik atau garis miring (mengikut ungkapan biasa yang anda berikan dalam peraturan sebelumnya), jika tidak, ia tidak akan diubah hala atau ditulis semula. Ambil perhatian bahawa titik tersurat dalam kelas aksara ungkapan biasa tidak memerlukan pelarian garis miring ke belakang. 🎜

    Sila ambil perhatian bahawa saya menganggap (berdasarkan contoh anda) bahawa URL yang diminta tidak berakhir dengan garis miring (iaitu /server/ServerName dan bukannya /server/ServerName/< /code >), jadi saya mengalih keluar peraturan terakhir /? pada penghujung RewriteRule /server/ServerName 而不是 < code>/server/ServerName/),因此我删除了 RewriteRule pattern 末尾的可选 /?pattern

    . Walaupun petikan log anda nampaknya mencadangkan sebaliknya? Jika anda benar-benar perlu membenarkan URL slash mengekor dan tidak mengekori, maka ini harus dilaksanakan sebagai "ubah hala" yang berasingan untuk menormalkan URL, bukannya sebagai sebahagian daripada "tulisan semula" yang sebaliknya akan mempromosikan kandungan pendua (garis miring dan URL tanpa garis miring adalah URL yang berbeza).

    Server URL 参数值中期望的值,NE (noescape) 标志可能是也可能不是必需的。 QUERY_STRING URL dikodkan berdasarkan

    pembolehubah pelayan anda.

    .htaccess 中使用 PT (passthrough) 标志,因为这是此上下文中的默认行为。 (PTAnda tidak perlu menggunakan bendera yang hanya relevan apabila menggunakan mod_rewrite dalam konteks server atau vhost

    . )🎜

    balas
    0
  • Batalbalas