2010-02-26 3 views
0

im essayant d'écrire un script, qui peut réécritures urls de façon limace, comme ceci:comment générer des limaces en php

http://www.mysite.com/mystorytitle/

et je l'ai fait dans mes codes:

RewriteRule ^(.*)\/$ app=News&file=article&title=$1 [L] 

et dans mes codes php, je créé une limace sur le titre de l'histoire comme:

$slug_title = mysql_real_escape_string($mtitle); 
$show= "<a href=\"$slug_title/\">$mtitle</a>"; 

maintenant tout va bien sauf si je clique sur le lien slugged, il va à la page mais sans aucun style et javascripts et images.

Je suis sûr que le problème est dû au fait de chemin pour les fichiers CSS et ... qui a changé été un niveau

que je suis dans ce chemin: http://www.mysite.com/ایمیل/

donc si la page nécessite css fichier comme ceci:

<link rel="StyleSheet" href="includes/NAV.css" type="text/css" /> 

un niveau changé et de faire cela a fonctionné, je devrais revenir un niveau:

<link rel="StyleSheet" href="../includes/NAV.css" type="text/css" /> 

je suppose, cela est concidered comme un dossier et non un chemin réécrite

, mais je suis sûr qu'il devrait y avoir une autre façon de faire ce travail de script sans changer tous les chemins

merci à l'avance

+0

Soit dit en passant, 'mysql_real_escape_string' est la mauvaise évasion pour mettre du texte en HTML. C'est seulement pour les requêtes MySQL et ne vous protégera pas de l'injection HTML (XSS). Vous devriez utiliser 'htmlspecialchars' à la place, pour' $ mtitle'. Idéalement, vous devriez aussi utiliser 'urlencode' pour' $ slugtitle', afin qu'il fonctionne comme un ancien URI simple ainsi qu'un IRI. – bobince

+0

sur quelle base vous dire que urlencode est bien mieux que mysql_real_escape_string, BTW lors de l'utilisation urlencode il ajouterait "+" au titre –

Répondre

1

Vous devriez préfixer URL de base (la plupart du temps, barre oblique, mais pas toujours).

Vous pouvez l'obtenir comme suit (expression générale qui fonctionnera même si votre site réside dans un répertoire):

$baseUrl = rtrim((string)dirname($_SERVER['SCRIPT_NAME']), '/\\') . '/'; 

Et puis vous écrivez:

<link rel="StyleSheet" href="<?php echo $baseUrl ?>includes/NAV.css" type="text/css" /> 

Une autre possibilité est pour utiliser l'étiquette de base en tête:

<base href="<?php echo $baseUrl ?>" /> 

Ceci a l'avantage de ne changer qu'une seule ligne dans votre c ode.

Vous pouvez aller furthur et faire méthode utilitaire pour ce faire:

function baseUrl($url = '', array $query = null, $fragment = null) 
{ 
    static $baseUrl = rtrim((string)dirname($_SERVER['SCRIPT_NAME']), '/\\') . '/'; 

    if ($query !== null) { 
     $url .= '?' . http_build_query($query); 
    } 

    if ($fragment !== null) { 
     $url .= '#' . (string)$fragment; 
    } 

    $url = $baseUrl . $url; 
    $url = trim(str_replace('\\', '/', (string)$url)); 

    return $url; 
} 
2

Comme vous l'avez déjà écrit, cela arrivera parce que le navigateur pense que vous êtes dans un répertoire différent nommé d'après votre slug.

Vous devrez faire quelque chose aux URL CSS, soit les référencer relativement ../includes/ comme vous le faites déjà, ou utiliser des références absolues /includes/NAV.css (la partie de domaine étant en option).

Si c'est un projet PHP, je crée un fichier de paramètres central contenant la racine web:

define("SITE_WEBROOT", "http://www.domain.com"); 

et référence toutes les ressources par rapport à ce paramètre:

<link rel="stylesheet" type="text/css" 
     href="<?php echo SITE_WEBROOT; ?>/includes/NAV.css"> 
+0

c'est ce que je fais, je ai court-circuité à '': D – casraf

+0

merci, toute ma tentative est pour ne pas trop changer, si je veux suivre votre idée, je devrais changer plus de 20 ressources (css, js, ..) liens, et je devrais faire la même chose pour mes clients qui utilisent mon CMS, im recherche une solution qui peut distinguer le chemin de limace d'un chemin de dossier, vous savez ce que je dis?! –

+0

@Mac Taylor Je comprends ce que vous dites mais il ne peut pas être fait correctement vraiment. C'est le * navigateur * qui pense que c'est dans un répertoire différent. Vous pouvez créer une règle de réécriture qui redirige toutes les requêtes pour '/ slugname/includes/NAV.css' vers'/includes/NAV.css' mais c'est une connerie. Je pense que l'introduction d'un paramètre de racine Web est la seule solution, surtout si vous avez un CMS que vous expédiez aux clients. –

0

il suffit d'ajouter une barre oblique avant tous les URIs des ressources ... comme /static/image.png. Cela fera que le navigateur le demandera à partir de la racine (par exemple www.site.com/path)

0

Vous pouvez également utiliser la balise de base dans votre section head, alors tous les liens, feuilles de style et images relatifs iront à partir de là. Nous faisons habituellement cela. Il est mis automatiquement dans tous nos projets basés sur l'URL de demande et FICHIER chemin du index.php

Par exemple:

Questions connexes