2010-11-09 4 views
2

Ceci est une nouvelle compréhension d'une question que je tition:Essayer d'obtenir à un php/javascript bibliothèque commune avec mod_rewrite

J'ai un extrait de mod_rewrite qui découvre si javascript, css, fichiers php existe sur le sous-domaine où ils sont appelés (par exemple, subdomain.example.com). S'ils n'existent pas, alors Apache redirige vers common.example.com où les fichiers js, css et php sont communs. Voir ci-dessous:

RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)\.(js|css|php)$ http://common.example.com/$1.%2 [L] 

Cela fonctionne si:

  • Vous branchez explicitement le nom de fichier demandé dans la barre d'adresse.
  • Cela fonctionne également si js ou css est référencé/lié dans le balisage html.

Il ne fonctionne pas si

  • L'URL est utilisé dans un fichier php ou js (par exemple, pour un appel ajax). Au contraire, il fait référence au sous-domaine où la page html se trouve (c.-à-mod_rewrite ne se coince pas): subdomain.example.com

Merci SO pour votre aide

EDIT

de requestion de Per Pekka, ici est un exemple:

  1. Prenez par exemple subdomain.example.com/test.html
  2. test.html références <script src="/code/js/test.class.js" type="text/javascript" ></script>
  3. En test.class.js il y a $.ajax({ url: "/code/php/test.php", dataType : "json", data: {cmd : 'someCommand'}, success: callback()});

..

  • DonC# 2, il trouve common.example.com/code/js/test.class.js (Correct!) Mais en # 3, l'ajax appelle subdomain.example.com/code/php/test.php (Incorrect! en raison de subdomain)
+1

Les URL sont des URL, peu importe où elles sont référencées. Ils devraient toujours travailler de la même manière. Lorsque le sous-domaine est référencé, l'URL doit être automatiquement réécrite. Pouvez-vous faire un exemple? –

+0

Bonjour @Pekka! J'ai écrit un exemple. J'espère que ça va aider? – Kyle

+0

@Emile ouais, je l'ai déjà vu. Vous dites donc que les règles mod_rewrite sont appliquées lorsque vous faites référence à subdomain.example.com/code/js/test.class.js dans le navigateur, mais pas lorsque vous faites référence à un JavaScript dans une page HTML? –

Répondre

0

Ceci est un effet secondaire de changer LEDOMAINE (comme il est apparu) en modifiant le protocole à l'intérieur de la réécriture. En spécifiant une URL complète dans votre RewriteRule au lieu d'un chemin de système de fichiers, vous forcez le serveur à envoyer un en-tête de redirection 301 pour chaque requête.

requêtes AJAX généralement follow header redirects, mais vous redirigez vers un autre domaine, violant ainsi le Same Origin Policy!

Cela signifie que pour les requêtes Ajax, vous ne pouvez pas utiliser cette méthode de redirection.Vous devez spécifier un chemin de système de fichiers dans votre RewriteRule pour que la réécriture puisse avoir lieu en interne (de sorte que le navigateur reste subdomain.example.com/code/php/test.php). Je ne sais pas si cela peut être fait dans votre configuration.

+0

Désolé @Pekka pour les quantités massives de suivi, mais si c'est le cas, coder en dur l'URL complète de php dans le javascript fonctionne. Cela ne signifie-t-il pas que c'est un problème avec mod_rewrite et pas la même politique d'origine ajax? Je vais certainement accepter cette réponse, juste un commentaire de plus :) – Kyle

+0

@Emile aaaah, intéressant! Alors ce que je dis à propos de la même politique d'origine * ne peut pas s'appliquer ici parce que vous redirigez vers un domaine supérieur d'un sous-domaine. J'ai oublié ça. Ensuite, il pourrait être le «302», je vais vérifier si je peux trouver quelque chose sur ce –

+1

@Emile non, le '302' devrait être interprété correctement, je ne sais pas ce que le cas est ici. Ce que vous pouvez essayer est une méthode de redirection différente comme '301' ou' 303': 'RewriteRule^(. *) \. (Js | css | php) $ http://common.example.com/$1.%2 [ L, R = 301] 'si cela ne fonctionne pas, je ne sais pas ce que c'est. Vous n'êtes pas en train de mélanger des protocoles (http/https)? –