2011-03-28 4 views
2

css J'utilise le paramètre suivant pour l'URL Rewriting:réécriture d'url lien cassé à

RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} !-d 
    RewriteCond %{REQUEST_FILENAME} !-f 
    RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

Dans index.php est $_GET['url'] analyser de telle sorte que dans les exemples suivants:

ROOT/user/id/1/name/bobby // user is the page, id = 1, name = bobby 
ROOT/blog/post/123/title/welcome // blog is the page, post = 123, title = welcome 

Alors que le premier paramètre (? Je ne sais pas comment l'appeler) est le nom de la page, puis le couple de paramètres suivants sont comme "clés/valeur". Maintenant, lorsque je parcours ROOT/, le lien vers les feuilles de style qui sont insérées dans le html de la page et la page sont affichés correctement. Je fi parcourir ROOT/index (qui est le même que ROOT/) il montre la page (avec le contenu et d'autres choses) correctement mais les liens (même si dans la structure html sont correctement écrits) aux feuilles de style ne sont pas chargés. Et je peux voir cela du fait que ma page n'a pas de css du tout quand je le charge.

Comment puis-je résoudre ce problème?

EDIT

Le chemin du fichier CSS est la suivante:

project/view/css/common.css 

Le fichier où est-il inclus est

project/public/index.php // the one with .htaccess and rewrite rules 

Cela me amène à faire un lien (à l'intérieur l'index.php) tel que

../view/css/common.css 

Mais cela fonctionne différemment selon l'apparence de l'URL. Pour exemples:

# For URL = public/ 
project/view/css/common.css // good 
# For URL = public/index/ 
project/public/view/css/common.css // broken 
# For URL = public/index/key/value 
project/public/index/key/view/css/common.css // broken 
+1

à quoi ressemblent vos liens css dans votre code html? Ont-ils un slash précédent ou non? – davogotland

+0

@davogotland, mon lien ressemble à un lien de vrais chemins. – Shoe

+0

@davogotland, ils ressemblent à ceci http: //localhost/project/public/view/css/index.css – Shoe

Répondre

3

Je pense que vous avez deux problèmes (comme les réponses données à résoudre votre problème didnt encore ...):

  1. Vous réécrivez tous les noms de fichiers donc quand le navigateur demande css/index.css votre réécriture transforme cela en index.php?url=css/index.css. La réponse de @ cOle2 devrait résoudre cela.

  2. Vous n'utilisez pas de chemins absolus pour vos fichiers CSS.Le serveur traduit la page demandée comme /user/id/1/name/bobby en /index.php?etc.... mais lorsque le navigateur demande par exemple le fichier css qui est quelque chose comme css/index.css dans votre code, il demandera effectivement /user/id/1/name/bobby/css/index.css et ce fichier n'existe pas. Vous pouvez résoudre cela en utilisant uniquement des chemins absolus vers vos fichiers externes (css, js, images, etc.) comme /css/index.css.

Edit: Sur la base de vos commentaires, vos deux chemins sont relatifs et votre code CSS ne sont pas accessibles par le navigateur, vous devez:

  1. Déplacez le css dans le répertoire project/public (comme project/public/css)
  2. Utilisez les chemins absolus à votre CSS comme /css/index.css.
  3. Assurez-vous que les URL de vos fichiers externes ne sont pas réécrites par le serveur.
+0

Je pense que c'est un bon moyen. Le problème est que j'utilise un chemin relatif tel que "../view/css/common.css" pour accéder aux fichiers dans les dossiers qui sont de retour dans le dossier public. Comment pourrais-je le transformer en chemin absolu? – Shoe

+0

@Charlie Pigarelli Quelle est la racine de votre serveur Web par rapport à votre structure de répertoire? Si c'est 'project/public /' alors vos fichiers css ne sont pas accessibles au public, vous devrez donc les déplacer dans le répertoire 'project/public /'. – jeroen

+0

Le répertoire parcouru par l'utilisateur est 'project/public /' de sorte qu'il ne puisse pas accéder à tous les autres dossiers tels que 'project/class /' ou 'project/library /' ou 'project/view'. Alors que le fichier css est sur 'project/view/css/common.css'. – Shoe

2

Vous pouvez essayer de supprimer certaines extensions de fichiers à partir de la règle de réécriture, par exemple, la règle suivante ne tiendra pas compte des images, des fichiers CSS et js.

# Do not process images or CSS files further 
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L] 

Edit: Voici comment je l'appliquer:

RewriteEngine On 
RewriteRule \.(css|jpe?g|gif|png|js|ico)$ - [L] 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 
+0

@ cOle2, Comment l'implémenter dans mon code déjà existant? – Shoe

+0

Mettez-le après le RewriteEngine Sur la ligne – cOle2

+0

@ cOle2, ne fonctionne pas. J'ai également mis à jour ma question. S'il vous plaît, jetez un oeil. – Shoe

7

Commentaire ne me formate le code laisse pas, pouvez-vous s'il vous plaît essayez ceci:

RewriteEngine On 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_URI} !^.*\.(css|jpe?g|gif|png|js|ico)$ [NC] 
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] 

Mise à jour

Vous pouvez essayer quelque chose comme ça dans la section <head> de vos pages pour prendre en charge le chemin relatif de votre image/css/js fichiers référencés sur cette page:

<head> 
<base href="http://www.example.com/static-files/" /> 
</head> 
+0

cela ne fonctionne pas. – Shoe

+0

@Charlie Pigarelli: S'il vous plaît essayez d'ajouter la balise de base pour soutenir les URL relatives pour vos fichiers statiques sur la page: par exemple ' ' – anubhava

+0

+1 c'était la ligne que je cherchais pour arrêter mes demandes de réécriture de choses externes! –