La redirección interna .htaccess no funciona con el parámetro de cadena

6 minutos de lectura

avatar de usuario
Shahbaz A.

Así que he estado en esto durante horas, pero no puedo conseguir que se resuelva. Nada en stackoverflow aborda mi problema. El problema es que tengo una regla de redirección en mi .htaccess de la siguiente manera

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

Esta redirección funciona cuando cid es un número, pero cuando se usa una cadena como “mi llave” No funciona. Con la llave tengo que cambiar la regla a esto.

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [R,L]

Sin embargo, no quiero usar esto porque redirige a mis usuarios visiblemente y la URL cambia, lo cual no quiero. ¿Alguien puede explicar por qué esto funciona para números pero no para parámetros de cadena? Cualquier ayuda sería apreciada.

Editar: Completar .htaccess

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/
RewriteRule ^index\.php$ - [L]
RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

# END WordPress

  • ¿Es esta la única regla en su archivo .htaccess?

    – siempre despierto

    27 de julio de 2017 a las 5:58

  • ¿Puedes publicar las otras reglas del archivo .htaccess, por favor?

    – siempre despierto

    28 de julio de 2017 a las 1:19

  • No es posible encontrar al culpable mirando algunas reglas que parecen ser correctas. Debe configurar un nivel de registro para comprobar lo que está pasando LogLevel rewrite:trace3

    – revo

    29 de julio de 2017 a las 12:22

  • ¿Puede confirmar la ubicación de su .htaccess archivo… de sus directivas asumo que esto está en el /wordpress ¿subdirectorio? es decir. /wordpress/.htaccess?

    – Señor White

    29 de julio de 2017 a las 17:44

  • El sistema WordPress CMS no funciona bien con las reglas de reescritura. Tendrás que usar API de reescritura de WordPress para esto.

    – anubhava

    1 de agosto de 2017 a las 14:53

avatar de usuario
Urbano

Probé un poco en local y descubrí que funciona para mí si pongo estas dos reglas:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

incluso antes de la fila

RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

Completo .htaccess archivo será:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /wordpress/

RewriteRule ^index\.php$ - [L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^store-category/(.+)/?$ /wordpress/store-category/?cid=$1 [QSA,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /wordpress/index.php [L]
</IfModule>

De todos modos, con (.+)/?$se capturará una barra final final del grupo y se colocará en el cid parámetros Si las categorías no tienen barras dentro, es mejor usar ([^/]+)/?$.

Actualizar: Para comprender lo que sucede en sus redireccionamientos, habilite el registro (ver http://httpd.apache.org/docs/current/mod/mod_rewrite.html para esto). En mi host habilité mod_rewrite.c:trace3 y obtengo el siguiente inicio de sesión error_log (simplemente rastreando líneas con rewrite)

[Fri Aug 04 12:48:56.904099 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] strip per-dir prefix: /var/www/localhost/htdocs/wordpress/store-category/my-id -> store-category/my-id
[Fri Aug 04 12:48:56.904123 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] applying pattern '^index\\.php$' to uri 'store-category/my-id'
[Fri Aug 04 12:48:56.904129 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] strip per-dir prefix: /var/www/localhost/htdocs/wordpress/store-category/my-id -> store-category/my-id
[Fri Aug 04 12:48:56.904132 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] applying pattern '^store-category/(.+)/?$' to uri 'store-category/my-id'
[Fri Aug 04 12:48:56.904143 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] rewrite 'store-category/my-id' -> '/wordpress/store-category/?cid=my-id'
[Fri Aug 04 12:48:56.904147 2017] [rewrite:trace3] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] split uri=/wordpress/store-category/?cid=my-id -> uri=/wordpress/store-category/, args=cid=my-id
[Fri Aug 04 12:48:56.904151 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] trying to replace prefix /var/www/localhost/htdocs/wordpress/ with /wordpress/
[Fri Aug 04 12:48:56.904155 2017] [rewrite:trace2] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] trying to replace context docroot /var/www/localhost/htdocs with context prefix 
[Fri Aug 04 12:48:56.904158 2017] [rewrite:trace1] [pid 22823:tid 140368028878592] mod_rewrite.c(477): [client ::1:58312] ::1 - - [localhost/sid#788520][rid#7fa9e4002970/initial] [perdir /var/www/localhost/htdocs/wordpress/] internal redirect with /wordpress/store-category/ [INTERNAL REDIRECT]

(seguido de algún otro registro mientras intenta encontrar el documento predeterminado index.php)

  • @shazyriver, ¿puede acceder al registro de apache y activar el registro para mod_rewrite? (ver httpd.apache.org/docs/current/mod/mod_rewrite.html para esto)

    – Urbano

    4 de agosto de 2017 a las 10:21

  • httpd.conf o algún archivo importado por él (en mi PC lo tengo en /etc/apache2/modules.d/00_default_settings.conf pero depende de tu sistema)

    – Urbano

    4 de agosto de 2017 a las 10:29

  • demasiada información en el registro. No puedo obtener una pista 🙁

    – Shahbaz A.

    4 de agosto de 2017 a las 10:46

  • marque solo las líneas que contienen rewrite. Actualizo la publicación con mi registro ya que no me permite publicarla en los comentarios.

    – Urbano

    04/08/2017 a las 10:50


  • Hice. No me dan ni una pista.

    – Shahbaz A.

    5 de agosto de 2017 a las 2:25

avatar de usuario
nick kuznia

Regex es codicioso (de izquierda a derecha). Estás extrayendo barras adicionales, posiblemente otras cosas. Encuentro que es más fácil usar no clases para URL (rara vez ‘.’ que coincidirá con todo).

RewriteRule ^store-category/([^\/]+)/?$ store-category/?cid=$1 [QSA,L]

También puede simplificar esto, dependiendo de cómo desee manejar las URL que pueden tener un formato incorrecto después de la identificación de la categoría de la tienda.

RewriteRule ^store-category/([^\/]+) store-category/?cid=$1 [QSA,L]

EDITO: Tienes razón. No probé todo el htaccess. Está especificando la ruta de wordpress dos veces en rewritebase y nuevamente en la regla. He actualizado las reglas anteriores, además de proporcionar un enlace a la solución actualizada en un probador:

http://htaccess.mwl.be?share=116de701-cf8a-577c-bab5-5c357d844452

  • Esto todavía no afecta el resultado.

    – Shahbaz A.

    4 de agosto de 2017 a las 7:12

  • Muchísimas gracias. Pero yo no escribí esta regla. Usé la función de wordpress para generarlo automáticamente. Y usando un número funciona. Así que no creo que tenga nada que ver con la razón doble de la ruta de wordpress.

    – Shahbaz A.

    5 de agosto de 2017 a las 2:24

¿Ha sido útil esta solución?