htacces 2 masalah variabel
SEBELUM saya menginstal SSL semuanya berfungsi dengan baik !! Berikut adalah kode yang saya miliki di file .htaccess server web root saya:
Options +MultiViews
RewriteEngine On
RewriteCond %{HTTP_HOST} andrea\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://andrea.com/$1 [R,L]
RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule (.*) $1.php [L]
Ia bekerja dan melakukan apa yang saya inginkan. Jadi jika saya pergi ke misalnya:
www.andrea.com/account
itu mengakses "www.andrea.com/account.php". Itulah yang saya inginkan. Namun saya memiliki folder di root yang disebut "produk". Ada file ".htaccess" lain di folder itu dan saya tidak tahu mana dari 2 file ini yang harus diubah agar hal berikut di bawah ini berfungsi.
Saat Anda membuka url ini: http: ____ / products / view / Hello / Goodbye
Saya ingin mengakses "view.php" di folder 'produk' dan di file php itu saya bisa melakukan ini:
$id = $_GET["id"]; // This would have "Hello"
$cat = $_GET["cat"]; // This would have "Goodbye"
Dan ini berfungsi dengan baik saat saya menggunakan htaccess ini di folder "produk":
RewriteEngine on
RewriteCond %{HTTP_HOST} !^$ RewriteCond %{HTTP_HOST} !^www\. [NC] RewriteCond %{HTTPS}s ^on(s)| RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
Masalah dengan kode di atas adalah, jika saya pergi ke: http: ____ / products / Hello / Goodbye
Saya ingin itu mengakses "index.php" yang ada di folder "produk". Tapi sebaliknya, ini malah menuju "view.php" !! Ini seperti kode htaccess di atas yang memaksa semua untuk pergi ke view.php (yang seharusnya hanya dilakukan jika saya memiliki "view / ____" di url. Saya ingin url di atas pergi ke "index.php" di "produk "dan di dalam file itu saya harus dapat mengakses variabel ID dan CAT.
Ada ide tentang apa yang harus diubah dalam file .htaccess saya? Maaf saya menghabiskan lebih dari 2 jam saya tidak mengerti satu baris pun di bagian bawah kode saya tetapi tidak berhasil: /
Jawaban
Anda dapat menggunakan aturan berikut untuk menulis ulang /products/Hello/Goodbye
untuk /products/index.php
.
RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye [L,NC]
Ini lengkapnya /product/.htaccess
.
RewriteEngine on
RewriteCond %{HTTP_HOST} !^$
RewriteCond %{HTTP_HOST} !^www\. [NC]
RewriteCond %{HTTPS}s ^on(s)|
RewriteRule ^ http%1://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
#rewrite /products/Hello/GoodBye to /products/index.php
RewriteRule ^Hello/GoodBye/?$ /products/index.php?id=Hello&cat=Goodbye [L,NC] ################### RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
Options +MultiViews
Pertama, Anda harus menonaktifkan MultiView. Dalam jawaban saya atas pertanyaan Anda sebelumnya , saran saya untuk menggunakan MultiView hanyalah metode "alternatif" dalam konteks pertanyaan Anda. Anda tidak dapat menggunakan kedua metode (mod_rewrite dan MultiView) untuk bekerja dengan URL tanpa ekstensi. Dan karena Anda sekarang ingin melakukan lebih banyak hal dan meneruskan parameter, MultiView hanya akan membuat konflik. (MultiView kemungkinan akan "menang" dan tidak ada parameter yang lolos.)
Selain itu, apakah Anda secara khusus membutuhkan .htaccess
file tambahan di /products
subdirektori? Akan (bisa dibilang) lebih mudah untuk memiliki satu .htaccess
file di root dokumen. Ini akan menghindari keharusan mengulang pengalihan HTTP ke HTTPS (meskipun Anda sebenarnya tidak menyertakan pengalihan HTTP ke HTTPS di .htaccess
file subdirektori ?).
# /products/.htaccess RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2
Direktif ini cocok dengan keduanya view/Hello/Goodbye
dan Hello/Goodbye
, yang menjelaskan mengapa semuanya ditulis ke view.php
skrip Anda . Namun, itu tidak benar-benar melakukan apa yang Anda katakan - yang membingungkan. Jika Anda memintanya, /products/view/Hello/Goodbye
ia akan menulis ulang permintaan tersebut ke /products/view.php?id=view&cat=Hello/Goodbye
- yang bukan merupakan maksudnya (kecuali MutliViews diaktifkan, dalam hal ini tidak ada parameter yang akan diteruskan sama sekali).
Anda harus benar-benar memeriksanya views
di jalur URL yang diminta sebelum mencoba menulis ulang ke views.php
. Dan jika views
tidak ada maka tulis ulang index.php
sebagai gantinya. "Pencabangan bersyarat" ini dapat dicapai dengan hanya mengatur arahan dalam urutan aturan "yang lebih spesifik" terlebih dahulu.
Misalnya, di .htaccess
file root Anda, coba yang berikut ini. (Dan hapus /products/.htaccess
file tersebut sekaligus.)
# Ensure that MultiViews is disabled
Options -MultiViews
RewriteEngine On
# HTTP to HTTPS canonical redirect
RewriteCond %{HTTP_HOST} example\.com [NC]
RewriteCond %{SERVER_PORT} 80
RewriteRule (.*) https://example.com/$1 [R=301,L]
# Abort early if the request already maps to (or looks like) a file or directory
RewriteCond %{REQUEST_URI} \.\w{2,4}$ [OR] RewriteCond %{REQUEST_FILENAME} -f [OR] RewriteCond %{REQUEST_FILENAME} -d RewriteRule ^ - [L] # 1. Rewrite "/products/view/<id>/<cat>" to "/products/view.php?id=<id>&cat=<cat> RewriteRule ^(products/view)/([^/]*)/?(.*) $1.php?id=$2&cat=$3 [L]
# 2. Rewrite "/products/<id>/<cat>" to "/products/index.php?id=<id>&cat=<cat>
RewriteRule ^(products)/([^/]*)/?(.*) $1/index.php?id=$2&cat=$3 [L] # 3. Extensionless URLs for other requests RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
Urutan 3 aturan di atas penting. Aturan paling spesifik adalah yang pertama. Termasuk L
bendera untuk mencegah pemrosesan lebih lanjut (tidak perlu).
Perhatikan bahwa, sesuai arahan asli Anda, untuk permintaan dalam bentuk /products/view/Hello/Goodbye
(atau /products/Hello/Goodbye
), Hello/Goodbye
bagian tersebut sepenuhnya opsional dan secara alami akan menghasilkan parameter URL id
dan cat
yang disetel, tetapi kosong.
Selain itu, sesuai arahan asli Anda, permintaan formulir /products/view/Hello/Goodbye/foo/bar/baz
akan menghasilkan cat
parameter URL yang disetel ke Goodbye/foo/bar/baz
(apa pun yang mengikuti segmen jalur awal).
Anda tidak perlu memeriksa bahwa permintaan dipetakan ke file atau direktori (yang relatif mahal ) jika Anda membuat regex Anda lebih spesifik dan hanya cocok dengan yang Anda perlukan. Misalnya, regex Anda /([^/]*)/?(.*)
saat ini cocok dengan hampir semua hal . Tetapi jika Anda <id>
dan <cat>
variabel hanya dapat terdiri dari huruf kecil (misalnya) maka ini dapat menghindari kebutuhan untuk pemeriksaan sistem file.
Catatan lain:
- Apakah Anda perlu memeriksa nama host di pengalihan HTTP ke HTTPS? Apakah Anda menghosting beberapa domain? Jika tidak, kondisi yang memeriksa
HTTP_HOST
variabel server tidak diperlukan.