problemas de htacces 2 variables

Nov 26 2020

¡¡ANTES de instalar SSL, todo funcionaba perfectamente !! Aquí está el código que tengo en el archivo .htaccess de mi servidor web raíz:

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]

Funciona y hace exactamente lo que quiero que haga. Entonces, si voy a, por ejemplo:

www.andrea.com/account

accede a "www.andrea.com/account.php". Que es lo que quiero. Sin embargo, tengo una carpeta en la raíz llamada "productos". Hay otro archivo ".htaccess" en esa carpeta y no sé cuál de estos 2 debe cambiarse para que funcione lo siguiente.

Cuando acceda a esta URL: http: ____ / products / view / Hello / Goodbye

Quiero que acceda a "view.php" en la carpeta 'productos' y en ese archivo php podría hacer esto:

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

Y esto funciona bien cuando uso este htaccess en la carpeta "productos":

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

El problema con este código anterior es que si voy a: http: ____ / products / Hello / Goodbye

Quiero que acceda al "index.php" que se encuentra en la carpeta "productos". ¡¡Pero en su lugar va a "view.php" en su lugar !! Es como si el código htaccess anterior obligara a todos a ir a view.php (lo cual solo debería hacerse si tengo "view / ____" en la url. Quiero que la url de arriba vaya a "index.php" en los "productos "y en ese archivo debería poder acceder a las variables ID y CAT.

¿Alguna idea de qué cambiar en mi archivo .htaccess? Lo siento, pasé más de 2 horas, no entiendo una sola línea al final de mi código, pero no funciona: /

Respuestas

1 AmitVerma Nov 26 2020 at 11:35

Puede utilizar la siguiente regla de reescribir /products/Hello/Goodbyea /products/index.php.

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

Aquí está tu 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

En primer lugar, debe desactivar MultiViews. En mi respuesta a su pregunta anterior , mi sugerencia de utilizar MultiViews fue estrictamente un método "alternativo" en el contexto de su pregunta. No puede utilizar ambos métodos (mod_rewrite y MultiViews) para trabajar con URL sin extensión. Y dado que ahora desea hacer más cosas y pasar parámetros, MultiViews solo creará conflictos. (Es probable que MultiViews "gane" y no se pase ningún parámetro).

Además, ¿necesita específicamente el .htaccessarchivo adicional en el /productssubdirectorio? Será (posiblemente) más fácil tener un solo .htaccessarchivo en la raíz del documento. Esto evitará tener que repetir la redirección de HTTP a HTTPS (aunque en realidad no ha incluido una redirección de HTTP a HTTPS en el .htaccessarchivo de subdirectorio ).

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

Esta directiva coincide con view/Hello/Goodbye y Hello/Goodbye , lo que explica por qué se escribe todo en su view.phpscript. Sin embargo, tampoco está haciendo lo que dices, lo cual es desconcertante. Si lo solicita /products/view/Hello/Goodbye, reescribirá la solicitud en /products/view.php?id=view&cat=Hello/Goodbye, que no es la intención (a menos que MutliViews esté habilitado, en cuyo caso no se pasará ningún parámetro).

En realidad, debe verificar viewsla ruta de URL solicitada antes de intentar reescribir views.php. Y si viewsno está presente, reescriba en su index.phplugar. Esta "ramificación condicional" se puede lograr simplemente organizando las directivas en el orden de reglas "más específicas" primero.

Por ejemplo, en su .htaccessarchivo raíz intente lo siguiente. (Y elimine el /products/.htaccessarchivo por completo).

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

El orden de las 3 reglas anteriores es importante. La regla más específica es la primera. Incluyendo la Lbandera para evitar un procesamiento adicional (innecesario).

Tenga en cuenta que, de acuerdo con sus directivas originales, para una solicitud del formulario /products/view/Hello/Goodbye(o /products/Hello/Goodbye), la Hello/Goodbyeparte es completamente opcional y, naturalmente, dará como resultado que se establezcan los parámetros idy catURL, pero vacíos.

Además, según sus directivas originales, una solicitud del formulario /products/view/Hello/Goodbye/foo/bar/bazdará como resultado que el catparámetro de URL se establezca en Goodbye/foo/bar/baz(cualquier cosa que siga el segmento de ruta inicial).

No es necesario que compruebe que una solicitud se asigna a un archivo o directorio (que es relativamente caro ) si hace que su expresión regular sea más específica y solo coincida con lo que necesita. Por ejemplo, su expresión regular /([^/]*)/?(.*)coincide con casi cualquier cosa . Pero si sus variables <id>y <cat>solo pueden consistir en letras minúsculas (por ejemplo), esto podría evitar la necesidad de verificaciones del sistema de archivos.

Otras notas:

  • ¿Necesita verificar el nombre de host en la redirección de HTTP a HTTPS? ¿Aloja varios dominios? De lo contrario, HTTP_HOSTno se requiere la condición que verifica la variable del servidor.