Menulis ulang aturan dengan QUERY_STRING tidak berfungsi

Oct 22 2020

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

1 MrWhite Oct 22 2020 at 14:13
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 karena p=tidak terjadi sebagai bagian dari jalur URL (ini adalah bagian dari string kueri). The RewriteRule 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_STRINGvariabel server valuesebagai pengganti parameter URL yang diperlukan dalam string substitusi . Tapi QUERY_STRINGjelas seluruh "query string", sehingga akan berakhir membangun query string cacat dalam bentuk: page=p=<value>.

  • Penggunaan QSAhasil 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 dalam RewriteRule 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 %1backreference mengacu pada kelompok ditangkap di cocok terakhir CondPattern , yaitu. nilai pparameter URL. Diasumsikan bahwa p=<value>satu-satunya parameter URL di permintaan.


UPDATE: sepertinya tidak berfungsi ... jika saya menelepon localhost/list/?p=2saya 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=2tidak 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=2seperti 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?