2010-06-02 2 views
0

J'ai mod_rewrite sur la plupart de mon site. En ce moment j'ai une recherche qui normalement pointer versmod_rewrite avec les requêtes GET

search.php?keyword=KEYWORD 

Et je suis en train de réécrire que pour

search/?keyword=KEYWORD 

Juste pour faire un peu plus propre. Alors, voici mon mod_rewrite. (Il existe d'autres règles que je suis juste affichant celui qui ne fonctionne pas.)

RewriteRule ^search/?keyword=([^/\.]+)/?$ search.php?search=$1 

Lorsque je tape une recherche dans la façon dont la barre d'adresse, je veux que ce soit, je reçois une page me dire son un "lien cassé" (je devine que c'est l'équivalent de Chrome d'une erreur 404). Alors qu'est-ce que je fais mal? Je pense que le problème est le '=' ou le '?' signer dans la règle (la première partie) parce que quand je prends le? keyword = part, ça marche. Cela a-t-il du sens?


EDIT: Ceci est mon code complet .htaccess:

RewriteEngine on 
RewriteRule ^$ index.php 
RewriteRule ^thoughts$ archives.php 
RewriteRule ^thoughts/$ archives.php 
RewriteRule ^about$ about.php 
RewriteRule ^about/$ about.php 
RewriteRule ^search/\?keyword=([^/]+)$ search.php?search=$1 
RewriteRule ^tags/([^/]+)$ tags.php?tag=$1 
RewriteRule ^thoughts/([^/]+)$ post.php?title=$1 [L] 

obtenir encore une page d'erreur ...

+0

Avez-vous besoin d'un antislash avant la barre oblique? La barre oblique a une signification pour certaines bibliothèques regex. – barrycarter

+0

Non, essayé et n'a rien changé. De plus, tous mes autres réécritures avec des barres obliques fonctionnent bien. Merci quand même! – williamg

Répondre

5

Si vous voulez juste transformer:

search.php?keyword=KEYWORD 

dans:

search/?keyword=KEYWORD 

tout ce que vous devez faire est:

RewriteRule ^search/$ search.php [QSA] 

Le drapeau QSA signifie "chaîne de requête append" , et passe à search.php tout ce que vous demandez via GET:

search/?keyword=KEYWORDD 
search/?name=value&name2=value2  

Vous pouvez également vérifier Apache MultiViews, qui envoie. Fichier * chaque/foo foo demande à tout ce qu'il trouve dans le répertoire /, bien qu'ils soient considered bad.

+0

Génial! Merci! – williamg

+0

J'aimerais que les gens cessent de se lier à cet article. C'est un malentendu sur la façon dont PHP devrait être configuré dans apache (indice: ce n'est pas 'Addtype application/x-httpd-php .php') – Artefacto

1
RewriteRule ^search/\?keyword=([^/.]+)/?$ search.php?search=$1 

Le caractère point d'interrogation a une signification particulière dans une expression régulière. Vous devez y échapper.

En outre, le point n'a pas de signification particulière à l'intérieur d'une classe de caractères; vous n'avez pas besoin de l'échapper (vous avez besoin que ce mot-clé ne contienne pas de barres obliques et de points).

+0

Merci, j'ai pensé qu'il y avait quelque chose comme ça, mais j'ai toujours des problèmes. Je reçois toujours la page d'erreur saem. Je poste tout mon code .htaccess, parce que je fais peut-être autre chose de mal. – williamg

+0

@iMaster Êtes-vous sûr de vouloir '/?' À la fin de la chaîne de requête? Je ne suis même pas sûr que '/' et '?' Peuvent être dans une chaîne de requête. – Artefacto

+0

Mon .htaccess modifié a été posté ci-dessus. Je ne reçois toujours aucun résultat. – williamg

Questions connexes