2009-10-29 4 views
0

Je travaille pour une entreprise qui avait une polocyte d'URLs obscurcissantes pour les articles que vous deviez vous inscrire pour utiliser. Donc, ils auraient quelque chose commeAnnuler l'URL en utilisant le réécrire le mod

/story.php?story_id=Z_ZXYZ

où il y avait un code qui mis en correspondance des lettres aux chiffres de travailler l'histoire vraie id

si

Z = 0 
Y = 1 
X = 2 

etc.

Nous déplaçons maintenant la pile de technologie et avons décidé que les urls obfuscated ne sont pas nécessaires. Je cherche donc à savoir s'il est possible d'un obscurcir les URL en utilisant mod rewrite

Jusqu'à présent, je

RewriteCond %{REQUEST_URI} ^.*story.php [NC] 
    RewriteCond %{QUERY_STRING} ^.*story_id=Z_([ZXYWVUTSRQ]*) [NC] 
    RewriteRule ^.*$ /story/${decryptmap:%1} [L,R=301] 

J'ai une carte de réécriture dans le fichier httpd.conf

<IfModule mod_rewrite.c> 
    RewriteMap decryptmap txt:decyrpsdstxt 
</IfModule> 

Ce qui a un contenu

## 
## decrypt urls 
## 
Z 0 
X 1 

etc ..

mais il dosnt semble fonctionner, même si je mets un texte dans la RewriteRule comme si RewriteRule ^.*$ /story/${decryptmap:ZXY} [L,R=301] je reçois une URL comme /story/?story_id=Z_ZAD

Y at-il évident que je fais mal? Je peux voir que les deux conditions sont assorties, mais la carte ne semble pas fonctionner.

Dois-je même essayer de réécrire mod pour faire cela? Je pourrais rediriger vers un script qui le ferait assez facilement mais qui mettrait le code de redirection à deux endroits dont je n'ai pas aimé l'idée.

(je ne suis pas inquiet au sujet de la? Story_id = Z_ZAD, je sais comment se débarrasser de cette)

Répondre

1

Une carte de réécriture travaillerait avec toute la chaîne qui a été passé. Donc, dans votre cas, vous devrez passer un seul caractère à la fois:

# put story_id at the begin for efficiency 
RewriteCond %{QUERY_STRING} ^(([^&]*&)+)(story_id=Z_[^&]*)&*(.*)$ 
RewriteRule ^story\.php$ story.php?%3&%1%4 

# decrypt story_id value character by character 
RewriteCond %{QUERY_STRING} ^story_id=Z_([^ZXYWVUTSRQ]*)([ZXYWVUTSRQ])(.*) 
RewriteRule ^story\.php$ story.php?story_id=Z_%1${decryptmap:%2}%3 [N] 

# redirect 
RewriteCond %{QUERY_STRING} ^story_id=Z_([^&])&*(.*) 
RewriteRule ^story\.php$ /story/%1?%2 [L,R=301] 
+1

alternative, il pourrait utiliser script qui serait juste obtenir la carte et le coupler avec l'URL correcte, si mod_rewrite ne fonctionnerait pas. – dusoft

+0

@dusoft: Oui, absolument. En fait, le type de carte de réécriture 'txt' utilise une recherche linéaire et donc O (n). Mais dix éléments ne sont pas un problème. Pour un plus grand nombre d'éléments, le type 'dbm' est un meilleur choix car il est implémenté avec une table de hachage (O (1)). – Gumbo

+0

Je l'ai eu à travailler en utilisant 301 redirections à chaque étape, je pense que certaines de mes autres règles le brisaient. –