2010-12-14 2 views
8

Je donne des URL aux personnes sur un site Web, qui indiquent réellement quelque chose de moche (sur le même site Web).Est-il acceptable d'avoir un fichier .htaccess très long?

http://www.mydomain.com/cool-URL
points de fait à
http://www.mydomain.com/boring.php?id=478547&sessid=34734asdf7&otherboringdetails

Je prévois d'y parvenir en modifiant le fichier .htaccess en cas de besoin. Je vais écrire le script PHP dans le fichier .htaccess, en ajoutant une nouvelle règle de réécriture chaque fois qu'il y a une nouvelle distribution d'une URL (à partir d'une zone d'administration qu'un controleur non-programmeur peut contrôler [spécifier le titre de l'URL nouvelle entrée, admin: elle sera assignée automagiquement]).

Est-ce que cela va poser problème, surtout après environ 1000 URL? Quel est le nombre réel acceptable? Parce que, je peux imaginer ceci: le serveur reçoit une demande pour une URL, alors il cherche dans le fichier .htaccess la bonne page pour cette URL, et envoie finalement l'utilisateur à la bonne page. Si cela ressemble à une recherche dans une base de données, cela peut prendre beaucoup de temps pour que l'utilisateur atteigne la bonne page ...

Des pointeurs à ce sujet, s'il vous plaît?

+0

Je suis intéressé. – Trufa

Répondre

18

Non, ce n'est pas OK et entravera la vitesse de chargement de votre page.

Les fichiers .htaccess sont évalués sur TOUTES les requêtes du serveur. Même pour les images statiques, les fichiers CSS et JS. Ainsi, vous demandez au serveur Web d'analyser plus de 1000 lignes REGEX éventuellement longues lors de l'exécution d'une requête.

De plus, le fichier .htaccess du répertoire parent est également traité pour les fichiers résidant dans le sous-répertoire. Donc, si votre grand fichier .htaccess est dans le répertoire racine du site Web, il sera traité pour toutes les demandes faites pour les fichiers dans les sous-répertoires aussi (avec le fichier .htaccess dans le sous-répertoire).

Que mon ami est beaucoup de traitement. Si vous avez une page avec 10 images (par exemple) il obtient des processus 11 fois. Et plus il y a de traitement dans le fichier, plus il faut de cycles. Alors oui, tout ce qui se trouve dans un fichier htaccess a un impact. Est-ce que cet impact est perceptible? C'est difficile à dire quand cela devient un problème. Mais il devrait être assez gros car le traitement est relativement simple, ce qui dans votre cas est.

La clé avec un fichier htaccess est de le rendre intelligent. Vous ne voudriez pas lister 200 entrées. Vous pouvez donc le faire avec quelques lignes (si vous voulez utiliser htaccess).

+0

D'accord, je vais chercher à faire la bonne expression rationnelle pour mon problème. Merci pour la clarification :) –

1

Ça devrait aller. Vous pourriez juste rencontrer le décalage de serveur quand il devient vraiment long. Je voudrais regarder dans les spécifications mod_rewrite, vous pourriez être en mesure d'automatiser les transferts avec une ligne & fonction regex. Je ne connais pas assez les variables url qui seront passées pour vous donner un exemple.

5

Je voudrais effectuer un test simple: générer un grand fichier .htaccess avec des URL aléatoires, et mesurer les performances qui en résultent.

import random,string 

def rand_string(): 
    length = random.randint(4,10) 
    res = [] 
    for i in range(length): 
     res.append(random.choice(string.letters)) 
    return ''.join(res) 

for i in range(1000): 
    print "RewriteRule %s http://www.mydomain.com/boring.php?%s [R]" % \ 
    (rand_string(), rand_string()) 
4

Avoir autant de règles est vraiment déconseillé. Ce n'est pas qu'ils sont dans un fichier. Htaccess ou qu'ils sont testés pour chaque demande. (Selon la configuration, cela peut également se produire si vous les mettez dans la configuration de votre serveur ou de votre hôte virtuel.)

Le simple fait de tester autant de règles et, selon les règles, toutes les règles doit être testé jusqu'à ce qu'une correspondance soit trouvée.Eh bien, vous pouvez contrer cela en arrangeant les règles dans l'ordre de probabilité de correspondance, de sorte que la probabilité de trouver une correspondance précoce est élevée. Mais sa complexité est toujours O (n) dans le pire des cas.

Si vous avez vraiment besoin de beaucoup de mappages et que les mappages sont corrigés, vous pouvez utiliser un RewriteMap hash file qui a une complexité de O (1) au lieu de O (n) pour les règles séparées. Ou vous déplacez le mappage vers votre application PHP et le faites là.

+0

Wow super conseils et merci pour le lien! –

1

Ce n'est certainement pas OK, comme quelques personnes l'ont mentionné.

Connaissez-vous toutes les URL que vous souhaitez réécrire auparavant. Si c'est le cas, vous pouvez stocker les règles dans une base de données, parcourir les règles et pré-générer les URLs et les stocker dans memcache, la clé étant l'URL et la valeur recherchées étant l'URL réelle du contenu.

Ensuite, lorsque la requête arrive, recherchez la clé dans memcache et redirigez l'utilisateur vers l'URL réelle. Je ne pense même pas que vous avez besoin de .htaccess pour cela.

Questions connexes