web-dev-qa-db-fra.com

Règle de réécriture personnalisée

J'ai besoin de faire de la réécriture d'URL, mais c'est tout nouveau pour moi et j'ai essayé plusieurs choses mais rien ne semble fonctionner. Par exemple: j'ai une URL qui ressemble à ceci.

http://example.com/directorio/?filter=all&search_text=&type=medicos&location=quito&cs_directory_search_location=Yes&search_view=&goe_location_enable=No&cs_loc_max_input=5&cs_loc_incr_step=1&submit=&action=cs_directory_map_search

Et je veux le faire ressembler à:

http://example.com/directorio/medicos/quito/

J'ai essayé quelque chose comme ça directement dans mon .htaccess.

RewriteRule ^directorio/([a-z]+)/([a-z]+)/?$ index.php?pagename=directorio&filter=all&search_text=&type=$1&location=$2&cs_directory_search_location=Yes&search_view=&goe_location_enable=No&cs_loc_max_input=5&cs_loc_incr_step=1&submit=&action=cs_directory_map_search [L]

Ça ne marche pas. Aussi essayé ...

add_action('init', 'my_custom_rewrites' );
function my_custom_rewrites(){

    add_rewrite_tag( '%filter%', '([^/]+)' );
    add_rewrite_tag( '%search_text%', '([^/]+)' );
    add_rewrite_tag( '%type%', '([^/]+)' );
    add_rewrite_tag( '%location%', '([^/]+)' );
    add_rewrite_tag( '%cs_directory_search_location%', '([^/]+)' );
    add_rewrite_tag( '%search_view%', '([^/]+)' );
    add_rewrite_tag( '%goe_location_enable%', '([^/]+)' );
    add_rewrite_tag( '%cs_loc_max_input%', '([^/]+)' );
    add_rewrite_tag( '%cs_loc_incr_step%', '([^/]+)' );
    add_rewrite_tag( '%submit%', '([^/]+)' );
    add_rewrite_tag( '%action%', '([^/]+)' );

    add_rewrite_rule(
        'directorio/([a-z]+)/([a-z]+)/?$',
        'index.php?pagename=directorio&filter=all&search_text=&type=$matches[1]&location=$matches[2]&cs_directory_search_location=Yes&search_view=&goe_location_enable=No&cs_loc_max_input=5&cs_loc_incr_step=1&submit=&action=cs_directory_map_search',
        'top' );
}

J'ai aussi lu un peu sur les vars de requête, mais comme je l'ai dit précédemment, c'est un thème que nous avons acheté et qui accède à toutes les variables de la chaîne de requête en utilisant $_GET et non pas get_query_var...

Je ne sais pas quel est le problème, mais je suis à court d’idées, c’est un moyen difficile de commencer à apprendre RewriteRules. En espérant que quelqu'un puisse aider.

Bonjour @Milo, merci pour votre réponse. Une dernière chose: mon site est en direct et le même site sur mon hôte local pour tester les modifications avant de les télécharger. Le problème est que, dans mon localhost, j’ai édité mon .htaccess directement et utilisé cette règle.

RewriteRule ^directorio/([a-z]+)/([a-z]+)/?$ index.php/directorio/?filter=all&search_text=&type=$1&location=$2&cs_directory_search_location=Yes&search_view=&goe_location_enable=No&cs_loc_max_input=5&cs_loc_incr_step=1&submit=&action=cs_directory_map_search [L]

Et cette règle, avec cette URL laide, fonctionne parfaitement, mais si je mets cette même règle sur le site actif, cela ne fonctionne pas du tout. En outre, si sur ce site actif, si j'utilise la même règle, mais avec le chemin absolu, la redirection est résolue sans aucun problème, cela ne me laissera tout simplement pas faire la Rewrite. Est-il possible que mon hébergement ait une configuration sur le serveur Apache causant ce problème?

2
Dysan G.

Ajoutez ce qui suit à votre .htaccess, entre les <IfModule mod_rewrite.c>:

RewriteCond %{QUERY_STRING} (^|&)filter=all&search_text=&type=(.*)&location=(.*)&cs_directory_search_location=Yes&search_view=&goe_location_enable=No&cs_loc_max_input=5&cs_loc_incr_step=1&submit=&action=cs_directory_map_search
RewriteRule ^(.*)$ /directorio/%2/%3/? [R=301,L]

Vous pouvez confirmer la logique via ce _ TESTEUR .htaccess . Votre .htaccess par défaut créé à partir de WordPress devrait maintenant ressembler à ceci:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# Custom RewriteRule
RewriteCond %{QUERY_STRING} (^|&)filter=all&search_text=&type=(.*)&location=(.*)&cs_directory_search_location=Yes&search_view=&goe_location_enable=No&cs_loc_max_input=5&cs_loc_incr_step=1&submit=&action=cs_directory_map_search
RewriteRule ^(.*)$ /directorio/%2/%3/? [R=301,L]
</IfModule>
# END WordPress
2