2010-02-26 195 views
0

我嘗試寫一個腳本,可以改寫蛞蝓方式的URL像這樣:如何生成PHP蛞蝓

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

,我在我的代碼這樣做:

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

,並在我的PHP代碼,我創建了一個塞了故事的標題爲:

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

現在一切都很好,除非我點擊slugged鏈接,它會進入頁面,但沒有任何樣式和JavaScript和圖像。

IM肯定,問題是,因爲CSS文件的路徑和...這是被改變的程度

,因爲我在這條道路: http://www.mysite.com/ایمیل/

所以如果頁面需要的CSS文件爲這樣:

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

一個水平變化,要做到這一點的工作,我應該回來的水平爲:

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

我想,這是concidered爲文件夾不是rewrited路徑

但是我相信應該有另一種方式來使這個腳本工作在不改變所有的路徑提前

感謝

+0

順便說一句,'mysql_real_escape_string'是把文本轉換成HTML錯誤的逃生。它僅適用於MySQL查詢,並且不會保護您免受HTML注入(XSS)的侵害。您應該使用'htmlspecialchars'代替'$ mtitle'。理想情況下,您還應該爲'$ slugtitle'使用'urlencode',以便它可以作爲普通的舊URI以及IRI。 – bobince 2010-02-26 10:59:46

+0

在什麼基礎上告訴urlencode遠遠好於mysql_real_escape_string,順便說一句,當使用urlencode時,它會爲標題 – 2010-02-26 11:25:44

回答

1

你應該預先考慮基本網址(大部分時間是正斜槓,但不總是)。

你可以得到它,如下所示(一般表達式,如果你的網站駐留在目錄中甚至會工作):

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

然後你會寫:

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

另一種可能性是使用頭部中的基本標籤:

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

這樣做的好處是隻需更改c中的一行頌。

你可以去furthur,使實用的方法來做到這一點:

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

正如你已經寫過的,這將發生,因爲瀏覽器認爲你是在一個不同的目錄下,你的slu named後命名。

你將不得不做一些在CSS的網址,請參考它們相對../includes/因爲你已經做的,或者使用絕對引用/includes/NAV.css(域部分是可選的)。

如果這是一個PHP項目,我會創建一個包含Web根中央設置文件:相對於設置

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

和參考的所有資源:

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

添加「+」這就是我所做的,我只是縮短到'':D – casraf 2010-02-26 10:23:29

+0

謝謝,我所有的嘗試都是不要改變那麼多,如果我想跟隨你的想法,我應該改變超過20個資源(CSS,js,..)鏈接,並且我應該對使用我的CMS的客戶也這樣做, 即時尋找一個解決方案,可以區分slu path路徑與文件夾路徑,你知道我在說什麼?! – 2010-02-26 10:24:53

+0

@Mac Taylor我明白你在說什麼,但它不能真正做到正確。這是*瀏覽器*認爲它在不同的目錄中。你可以建立一個重寫規則,將'/ slugname/includes/NAV.css'的所有請求重定向到'/ includes/NAV.css',但這是廢話。我認爲引入Web根設置是唯一的方法,尤其是*如果您有一個CMS,您可以向客戶發貨。 – 2010-02-26 10:26:47

0

所有資源的URI之前,只需添加一個斜槓......像/static/image.png。這將使從根本上瀏覽器請求它(即www.site.com/path

0

您也可以使用基本的標籤在你的腦袋部分,則所有相關鏈接,樣式表和圖像會從那裏。我們通常這樣做。它是基於請求URL和index.php文件

FILE路徑,例如我們所有的項目自動設置: