Menulis ulang aturan dengan QUERY_STRING tidak berfungsi
Di server Apache, saya perlu menulis ulang mydomain.com/something/?p=value ke mydomain.com/something/?page=value
Saya mencoba:
RewriteEngine On
RewriteCond %{QUERY_STRING} p=(.*)
RewriteRule ^(.*)/p=$ $1?page=%{QUERY_STRING} [L,QSA]
but don't waj, can help me?
Jawaban
RewriteCond %{QUERY_STRING} p=(.*) RewriteRule ^(.*)/p=$ $1?page=%{QUERY_STRING} [L,QSA]
Ada banyak "kesalahan" di sini:
The
RewriteRule
pola , yaitu.^(.*)/p=$
, tidak akan pernah cocok karenap=
tidak terjadi sebagai bagian dari jalur URL (ini adalah bagian dari string kueri). TheRewriteRule
pola pertandingan melawan URL-jalan saja, yang terutama tidak termasuk string. Jadi, di atas tidak akan melakukan apa pun untuk contoh URL yang disebutkan.Anda menggunakan
QUERY_STRING
variabel servervalue
sebagai pengganti parameter URL yang diperlukan dalam string substitusi . TapiQUERY_STRING
jelas seluruh "query string", sehingga akan berakhir membangun query string cacat dalam bentuk:page=p=<value>
.Penggunaan
QSA
hasil bendera dalam string kueri asli pada permintaan yang digabungkan dengan string kueri yang Anda gunakan dalam string substitusi . Jadi, ini akan menghasilkan&p=<value>
ditambahkan, yang bukan itu yang Anda butuhkan. Anda ingin mengganti string kueri yang ada.RewriteRule ^(.*)/p=$ $1?page=
- Anda mengecualikan garis miring dari grup penangkap dalamRewriteRule
pola , jadi ini secara efektif akan menghapus garis miring dari URL yang ditulis ulang. Ini berbeda dengan contoh Anda.Anda tampaknya memerlukan penulisan ulang internal (tanpa pengalihan eksternal ) dan Anda "hanya" mengubah nama parameter URL tunggal. Ini adalah sesuatu yang biasanya Anda selesaikan dalam aplikasi Anda, daripada URL yang ditulis ulang di Apache. (?)
Coba yang berikut ini sebagai gantinya:
RewriteEngine On
# Internally "rewrite" the request
RewriteCond %{QUERY_STRING} ^p=([^&]*)$
RewriteRule (.*/)$ $1?page=%1 [L]
Ini cocok dengan setiap jalur URL yang diakhiri dengan garis miring (seperti contoh Anda). The %1
backreference mengacu pada kelompok ditangkap di cocok terakhir CondPattern , yaitu. nilai p
parameter URL. Diasumsikan bahwa p=<value>
satu-satunya parameter URL di permintaan.
UPDATE: sepertinya tidak berfungsi ... jika saya menelepon
localhost/list/?p=2
saya langsung mengertilocalhost/list/?p=2
Ya, URL yang terlihat tidak berubah, karena ini adalah "penulisan ulang" internal (seperti yang Anda minta dalam pertanyaan Anda). URL secara internal ditulis ulang menjadi list/?page=2
. (Ada juga titik yang list/?page=2
tidak sepenuhnya merupakan titik akhir yang valid - ini memerlukan penulisan ulang lebih lanjut, mungkin oleh mod_dir untuk membentuk permintaan yang valid. Mis. list/index.php?page=2
?)
Jika Anda ingin URL berubah secara nyata, mungkin Anda memang memerlukan "pengalihan" eksternal ? Untuk ini, Anda perlu menyertakan awalan garis miring pada string RewriteRule
substitusi dan menambahkan tanda R
( redirect
). Sebagai contoh:
# Externally "redirect" the request
RewriteCond %{QUERY_STRING} ^p=([^&]*)$ RewriteRule (.*/)$ /$1?page=%1 [R=302,L]
jika saya mengubah aturan menjadi
localhost/list/?p=2&?p=2
seperti di bawah ini:RewriteEngine On RewriteCond %{QUERY_STRING} ^p=([^&]*)$ RewriteRule (.*/)$ $1&?page=%1 [L]
saya mendapatkan 'URL yang diminta
/list/&
tidak ditemukan di server ini.' sebagai '?' potong tulisan ulang
Jika Anda meminta localhost/list/?p=2&?p=2
(tapi mengapa?) Maka petunjuk di atas tidak akan melakukan apa-apa karena kondisinya tidak cocok.
Mengapa Anda menambahkan a &
di string RewriteRule
substitusi ? (Itu tidak masuk akal?) Itu memang akan menghasilkan jalur URL formulir /list/&
, jika aturan diproses. Tapi seperti yang dinyatakan, itu tidak akan diproses untuk URL yang Anda nyatakan?