.htaccess Redirect 301 dengan garis miring menambahkan garis miring ke tujuan

Oct 11 2020

Baru saja situs web saya selesai dan saya mencoba mengatur pengalihan di file .htaccess untuk tautan yang telah berubah

Ini berfungsi dengan baik, kecuali itu tidak berfungsi untuk /example/(dengan garis miring pada jalur sumber)

Redirect 301 /example /example.php

Jadi saya menambahkan ini ke akun untuk garis miring:

Redirect 301 /example/ /example.php

Tapi itu mengalihkan ke example.php/(menambahkan garis miring ke tujuan, yang tidak berfungsi)

Jelas saya melakukan ini salah. Cara apa yang lebih baik?

Jawaban

4 MrWhite Oct 12 2020 at 01:21

Tapi itu dialihkan ke example.php/

Itu disebabkan oleh aturan (asli) pertama. Perhatikan bahwa 301 sebelumnya (salah) kemungkinan besar telah di-cache oleh browser. Uji dengan 302 pengalihan (sementara) untuk menghindari kemungkinan masalah cache.

The Redirectdirektif adalah awalan-matching (segmen jalan utuh), dan semuanya setelah pertandingan ditambahkan ke akhir URL target. Jadi, pengalihan direktif pertama:

  • /example untuk /example.php
  • /example/kepada /example.php/dan
  • /example/abc untuk /example.php/abc

Jika perintah diurutkan seperti ini, maka perintah tersebut harus "berfungsi" untuk dua contoh URL yang diposting:

Redirect 301 /example/ /example.php
Redirect 301 /example /example.php

Namun, Redirectarahan tersebut sebenarnya bukan arahan yang benar untuk digunakan di sini, karena Anda memerlukan dua arahan untuk menangani ini. (Umumnya, dengan Redirectdirektif, Anda perlu menyertakan atau mengecualikan garis miring pada kedua sumber dan target URL.)

Anda bisa menggunakan RedirectMatchdirektif sebagai gantinya, yang cocok menggunakan regex. Misalnya, untuk menangani dengan dan tanpa garis miring:

RedirectMatch 301 ^/example/?$ /example.php

Ini hanya cocok /exampleatau /example/dan dialihkan ke /example.php.

Redirectdan RedirectMatchkeduanya merupakan bagian dari mod_alias.

Akan tetapi, jika Anda sudah menggunakan mod_rewrite, pertimbangkan untuk menggunakan mod_rewrite RewriteRuleuntuk menghindari potensi konflik, karena mod_rewrite selalu berjalan sebelum mod_alias, terlepas dari urutan perintah di dalam .htaccess. Sebagai contoh:

RewriteEngine On

RewriteRule ^example/?$ /example.php [R=301,L]

Perhatikan bahwa tidak ada awalan garis miring pada RewriteRule pola saat digunakan .htaccesskarena jalur URL yang cocok dengan pola telah menghapus prefiks direktori (yang selalu diakhiri dengan garis miring).

Perhatikan juga bahwa urutan arahan dalam setiap modul bisa jadi penting.

Selain: Jika situs web Anda "dibuat ulang", mengapa URL formulir "baru" /example.php? Ini sepertinya mundur?


PEMBARUAN: Saya meminta seseorang mengonversi situs web wordpress asli menjadi situs (hampir) setara yang hanya menggunakan HTML dan sedikit javascript dan php

Anda berpotensi dapat menyimpan URL WordPress asli (mis. /example) Dan secara internal menulis ulang permintaan ke file dasar yang menangani permintaan (mis. example.php) Alih-alih mengalihkan secara eksternal . Untuk ini, Anda perlu menggunakan mod_rewrite. Anda juga harus menautkan ke URL WordPress "lama" di sumber HTML Anda. misalnya. /example(dan pertimbangkan untuk mengkanonikalisasi garis miring - alihkan ke salah satu atau lainnya).

Untuk menulis ulang /example (atau /example/) secara internal,/example.php Anda hanya perlu menghapus Rflag dari RewriteRuleperintah di atas . Sebagai contoh:

RewriteRule ^example/?$ example.php [L]

(Saya juga telah menghapus awalan garis miring pada RewriteRule substitusi , yang sekarang tidak diperlukan karena kita menulis ulang ke jalur sistem file.)

Memberikan Anda link ke /exampledalam sumber HTML Anda, maka pengguna tidak menyadari bahwa permintaan tersebut benar-benar dipetakan example.php.