Cara mengarahkan ulang url yang memiliki spasi di dalamnya

Dec 30 2016

Saya mengalihkan dari URL ini

www.example.com/article.php?id=12&title=some-title

ke URL ini

www.example.com/article/12/some-title

Menggunakan aturan penulisan ulang URL ini

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [R=301,L]
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]

Tetapi jika URL memiliki spasi misalnya

www.example.com/article.php?id=12&title=some%20title

Maka aturan di atas tidak akan berhasil. Bagaimana saya dapat membuat URL ini berfungsi dengan aturan yang disebutkan di atas hanya menggunakan .htaccess?

Jawaban

1 MrWhite Dec 30 2016 at 10:15
RewriteRule ^article/(\d+)/([\w-]+)$ article.php?id=$1&title=$2[R=301,L]

Sedikit masalah sampingan, tetapi Anda kehilangan spasi sebelum RewriteRulebendera yang akan mengakibatkan penulisan ulang yang salah. Itu harus: ...&title=$2 [R=301,L].

Berkenaan dengan karakter spasi ( %20ketika URL / persen dikodekan) ... THE_REQUESTberisi karakter yang dikodekan URL, tetapi jalur URL yang cocok dengan RewriteRule pola adalah URL yang didekodekan (mis. Spasi literal). Dalam contoh di atas, ini berarti dua pola regex yang berbeda. Jadi, untuk mencocokkan spasi di titleAnda dapat mengubah aturan yang ada seperti:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=([\w%-]+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/([\w\s-]+)$ article.php?id=$1&title=$2 [R=301,L]

Setiap petunjuk diubah sedikit.

  • The CondPattern sekarang memungkinkan untuk karakter persen literal (mis. [\w%-]).
  • The NEflag diperlukan sebagai berikut RewriteRuleuntuk mencegah URL dikodekan ruang dari yang ganda dikodekan (misalnya. %2520).
  • Dan yang terakhir RewriteRulemembutuhkan \s(karakter spasi) yang ditambahkan ke pola . (Alternatifnya, Anda bisa menggunakan spasi dengan garis miring terbalik, yaitu \, atau hanya spasi dan mengelilingi seluruh pola dalam tanda kutip ganda.)

Ini hanya memungkinkan ruang tambahan . Meskipun CondPattern sekarang mengizinkan setiap persen karakter yang dikodekan, RewriteRulepola membatasi ini ke spasi kosong .


PEMBARUAN # 1: Untuk mengizinkan beberapa karakter tambahan ... [\w%-](semua yang ada di antara tanda kurung siku) adalah kelas karakter regex . Untuk memungkinkan lebih banyak karakter, Anda cukup menambahkan karakter ini ke kelas karakter. misalnya. Dalam kasus ,, 'dan ;, ini menjadi [\w%,';-]. Perhatikan bahwa tanda hubung ( -) harus muncul di awal atau akhir kelas karakter, karena ini adalah karakter meta khusus.

Untuk memperbolehkan karakter apapun maka Anda dapat mengubah polanya menjadi .+. Yang mana hanya 1 atau lebih karakter. Titik tersebut menunjukkan karakter apa pun . Jadi, ini akan menjadi:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /(article)\.php\?id=(\d+)&title=(.+)\ HTTP
RewriteRule ^article\.php$ /%1/%2/%3? [NE,R=301,L]
RewriteRule ^article/(\d+)/(.+) article.php?id=$1&title=$2 [R=301,L]