htacces 2 masalah variabel

Nov 26 2020

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

1 AmitVerma Nov 26 2020 at 11:35

Anda dapat menggunakan aturan berikut untuk menulis ulang /products/Hello/Goodbyeuntuk /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
1 MrWhite Nov 27 2020 at 07:13
 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 .htaccessfile tambahan di /productssubdirektori? Akan (bisa dibilang) lebih mudah untuk memiliki satu .htaccessfile di root dokumen. Ini akan menghindari keharusan mengulang pengalihan HTTP ke HTTPS (meskipun Anda sebenarnya tidak menyertakan pengalihan HTTP ke HTTPS di .htaccessfile 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.phpskrip Anda . Namun, itu tidak benar-benar melakukan apa yang Anda katakan - yang membingungkan. Jika Anda memintanya, /products/view/Hello/Goodbyeia 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 viewsdi jalur URL yang diminta sebelum mencoba menulis ulang ke views.php. Dan jika viewstidak ada maka tulis ulang index.phpsebagai gantinya. "Pencabangan bersyarat" ini dapat dicapai dengan hanya mengatur arahan dalam urutan aturan "yang lebih spesifik" terlebih dahulu.

Misalnya, di .htaccessfile root Anda, coba yang berikut ini. (Dan hapus /products/.htaccessfile 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 Lbendera 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/Goodbyebagian tersebut sepenuhnya opsional dan secara alami akan menghasilkan parameter URL iddan catyang disetel, tetapi kosong.

Selain itu, sesuai arahan asli Anda, permintaan formulir /products/view/Hello/Goodbye/foo/bar/bazakan menghasilkan catparameter 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_HOSTvariabel server tidak diperlukan.