2011-03-28 120 views
2

我使用以下URL重寫設置:URL重寫打破鏈接到CSS

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

index.php是解析$_GET['url']因此,在下面的例子:

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 

,使得第一參數(?我不知道如何調用它)是頁面名稱,那麼以下幾個參數就像「鍵/值」。 現在,當我瀏覽ROOT/鏈接到插入到頁面的HTML和頁面內的樣式表顯示正確。 我瀏覽ROOT/index(與ROOT/相同)它正確地顯示頁面(包含內容和其他內容),但鏈接(即使在html結構中正確寫入)到樣式表不加載。我可以看到,從我的網頁沒有CSS時,我加載它的事實。

我該如何解決這個問題?

編輯

CSS文件的路徑如下:

project/view/css/common.css 

是它包含該文件是在

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

這使我做一個鏈接(內index.php)如

../view/css/common.css 

但是,這工作根據網址看起來不同。對於例子:

# 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

你的CSS鏈接在你的html樣子是什麼樣的?他們是否有前面的斜線? – davogotland 2011-03-28 17:49:55

+0

@davogotland,我的鏈接看起來像真正的路徑鏈接。 – Shoe 2011-03-28 20:06:03

+0

@davogotland,他們看起來像這樣http://localhost/project/public/view/css/index.css – Shoe 2011-03-28 20:22:59

回答

3

我認爲你有兩個問題(如給定的答案didn't解決您的問題尚未...):

  1. 你重寫所有文件名的文件在該網頁上引用所以當瀏覽器請求css/index.css時,您的重寫將轉換爲index.php?url=css/index.css。 @ cOle2的答案應該可以解決這個問題。

  2. 你沒有爲你的css文件使用絕對路徑。服務器正在將請求的頁面(如/user/id/1/name/bobby)翻譯爲/index.php?etc....,但當瀏覽器請求例如代碼中類似css/index.css的css文件時,它實際上會請求/user/id/1/name/bobby/css/index.css,並且該文件不存在。您可以通過僅使用絕對路徑來連接外部文件(css,js,圖像等),如/css/index.css

編輯:根據您的意見,無論是你的路徑是相對的,你的CSS是不是由瀏覽器訪問的,所以你需要:

  1. 移動的CSS到project/public目錄(像project/public/css
  2. 使用絕對路徑到您的css像/css/index.css
  3. 確保您的外部文件的URL不被服務器重寫。
+0

我認爲這是一個好方法。問題在於我使用相對路徑(如「../view/css/common.css」)來訪問公用文件夾中的文件。我怎麼能把它變成絕對路徑? – Shoe 2011-03-28 20:38:07

+0

@Charlie Pigarelli與您的目錄結構相比,Web服務器的根源是什麼?如果它是'project/public /',那麼你的css文件不能公開訪問,所以你需要將它們移動到'project/public /'目錄。 – jeroen 2011-03-28 20:42:20

+0

用戶瀏覽的目錄是'project/public /',這樣他就不能訪問其他文件夾,比如'project/class /'或'project/library /'或'project/view'。而css文件在'project/view/css/common.css'上。 – Shoe 2011-03-28 20:44:54

2

你可以嘗試從重寫規則刪除某些文件擴展名,例如下面的規則將忽略圖像,CSS和JS文件。

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

編輯:這是我會怎麼應用它:

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,我如何在我現有的代碼中實現它? – Shoe 2011-03-28 20:01:15

+0

把它放在RewriteEngine在線 – cOle2 2011-03-28 20:32:42

+0

@ cOle2,不起作用。另外我更新了我的問題。請看一下。 – Shoe 2011-03-28 20:36:17

7

評論不會讓我格式化代碼,可以請你試試這個:

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] 

更新

您可以在頁面的<head>部分嘗試類似的操作,以支持image/css/js的相對路徑

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

它不起作用。 – Shoe 2011-03-28 20:19:03

+0

@Charlie Pigarelli:請嘗試添加基本標記以支持頁面上的靜態文件的相對URL:例如' ' – anubhava 2011-03-28 20:44:36

+0

+1這是我正在尋找的線,以阻止我的要求被重寫的外部東西! – 2011-06-02 17:11:13