htacces 2 variabili problemi

Nov 26 2020

PRIMA di installare SSL le cose funzionavano perfettamente !! Ecco il codice che ho nel file .htaccess del mio server web root:

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]

Funziona e fa esattamente quello che voglio che faccia. Quindi se vado ad esempio:

www.andrea.com/account

accede a "www.andrea.com/account.php". Che è quello che voglio Tuttavia ho una cartella nella root chiamata "prodotti". C'è un altro file ".htaccess" in quella cartella e non so quale di questi 2 debba essere cambiato per far funzionare la seguente cosa sotto.

Quando vai a questo URL: http: ____ / products / view / Hello / Goodbye

Voglio che acceda a "view.php" nella cartella 'prodotti' e in quel file php potrei fare questo:

$id = $_GET["id"];    //      This would have "Hello"
$cat = $_GET["cat"];    //   This would have "Goodbye"

E funziona bene quando uso questo htaccess nella cartella "prodotti":

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

Il problema con questo codice sopra è, se vado a: http: ____ / products / Hello / Goodbye

Voglio che acceda a "index.php" che si trova nella cartella "prodotti". Ma invece va a "view.php" !! È come se il codice htaccess sopra avesse costretto tutti ad andare su view.php (che dovrebbe essere fatto solo se ho "view / ____" nell'URL. Voglio che l'URL sopra vada a "index.php" nei "prodotti "e in quel file dovrei essere in grado di accedere alle variabili ID e CAT.

Qualche idea su cosa cambiare nel mio file .htaccess? Mi spiace di aver passato più di 2 ore Non capisco una sola riga in fondo al mio codice ma non funziona: /

Risposte

1 AmitVerma Nov 26 2020 at 11:35

È possibile utilizzare la seguente regola di riscrivere /products/Hello/Goodbyea /products/index.php.

RewriteRule ^Hello/GoodBye/?$ /product/index.php?id=hello&cat=Goodbye  [L,NC]

Ecco il tuo completo /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

Prima di tutto, dovresti disabilitare MultiViews. Nella mia risposta alla tua domanda precedente , il mio suggerimento di utilizzare MultiViews era un metodo strettamente "alternativo" nel contesto della tua domanda. Non è possibile utilizzare entrambi i metodi (mod_rewrite e MultiViews) per lavorare con URL senza estensione. E poiché ora desideri fare più cose e passare parametri, MultiViews creerà solo conflitti. (MultiViews probabilmente "vincerà" e nessun parametro verrà passato.)

Inoltre, hai specificamente bisogno del .htaccessfile aggiuntivo nella /productssottodirectory? Sarà (probabilmente) più facile avere un singolo .htaccessfile nella root del documento. Ciò eviterà di dover ripetere il reindirizzamento da HTTP a HTTPS (sebbene non sia stato effettivamente incluso un reindirizzamento da HTTP a HTTPS nel .htaccessfile della sottodirectory ?).

# /products/.htaccess
RewriteRule ^([^/]*)/?(.*)$ /products/view.php?id=$1&cat=$2

Questa direttiva corrisponde sia a view/Hello/Goodbye che Hello/Goodbye , il che spiega perché tutto viene scritto nel tuo view.phpscript. Tuttavia, non sta nemmeno facendo quello che dici, il che è sconcertante. Se lo richiedi /products/view/Hello/Goodbye, riscriverà la richiesta a /products/view.php?id=view&cat=Hello/Goodbye- che non è l'intenzione (a meno che MutliViews non sia abilitato, nel qual caso non verrà passato alcun parametro).

È necessario verificare effettivamente viewsil percorso dell'URL richiesto prima di tentare di riscrivere in views.php. E se viewsnon è presente, riscrivi index.phpinvece in. Questa "ramificazione condizionale" può essere ottenuta semplicemente disponendo prima le direttive nell'ordine di regole "più specifiche".

Ad esempio, nel tuo .htaccessfile root prova quanto segue. (E rimuovi del /products/.htaccesstutto il file.)

# 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]

L'ordine delle 3 regole sopra è importante. La regola più specifica è la prima. Incluso il Lflag per impedire ulteriori elaborazioni (non necessarie).

Si noti che, come per le vostre direttive originali, per una richiesta della forma /products/view/Hello/Goodbye(o /products/Hello/Goodbye), la Hello/Goodbyeparte è del tutto facoltativo e, naturalmente, comporterà la ide catessere insieme di parametri URL, ma vuoto.

Inoltre, secondo le tue direttive originali, una richiesta del modulo /products/view/Hello/Goodbye/foo/bar/bazcomporterà l' catimpostazione del parametro URL su Goodbye/foo/bar/baz(qualsiasi cosa che segue il segmento del percorso iniziale).

Non devi necessariamente controllare che una richiesta sia mappata a un file o una directory (che è relativamente costosa ) se rendi la tua regex più specifica e fai corrispondere solo ciò che devi abbinare. Ad esempio, la tua regex /([^/]*)/?(.*)attualmente corrisponde praticamente a qualsiasi cosa . Ma se le tue variabili <id>e <cat>possono essere costituite solo da lettere minuscole (ad esempio), questo potrebbe evitare la necessità di controlli del filesystem.

Altre note:

  • Hai bisogno di controllare il nome host nel reindirizzamento da HTTP a HTTPS? Ospitate più domini? In caso contrario, la condizione che controlla la HTTP_HOSTvariabile del server non è richiesta.