2014-09-25 68 views
1

所以我試圖使用網址重寫來簡化網站上的網址。保存舊目錄位置的Apache URL重寫?

用法示例:

www.example.com/test -> www.example.com/index.php?page=test 
www.example.com/test/x -> www.example.com/index.php?page=test&value=x 

我用這個改寫:

RewriteEngine on 

#Simplify url 
RewriteRule ^(\w+)/?$ index.php?page=$1 
RewriteRule ^test/(\w+)/?$ index.php?page=test&value=$1 

的問題是,這種方法似乎保留之前重寫的位置。因此,像CSS這樣的網站上加載的其他文件相對於原始位置而不是重寫後的位置。

實施例:
www.example.com/test/x重寫到
www.example.com/index.php?page=test&value=x

但是,當用戶輸入www.example.com/test/x時加載的CSS文件相對於/test/文件夾而非/文件夾加載。所以他們沒有找到。

我做錯了什麼嗎?我認爲重寫將從字面上重定向,所以像這樣的事情不會成爲問題。我想解決這個問題,而不是僅僅使用絕對網址 - 所以我仍然可以在我的測試服務器上使用它。

回答

1

1)

使用絕對URL沒有任何問題。您可以使用define

對於開發環境中使用:

define('BASE_URL', 'http://test.server.local/'); 

那麼對於生產環境只是將其更改爲:

define('BASE_URL', 'http://www.example.com/'); 

在你的代碼的所有頁面,您可以訪問這些網址

<a href="<?=BASE_URL.'test/x'?>">x page</a> 

因此,您不需要更改您引用的所有頁面上的代碼

2)

它是把所有你的CSS的樣式/目錄是個好主意,然後在.htaccess文件就可以了exclude it from rewriting這樣的:

RewriteEngine on 

# add this line: 
RewriteRule ^/?styles/.+$ - [L] 

#Simplify url 
RewriteRule ^(\w+)/?$ index.php?page=$1 
RewriteRule ^test/(\w+)/?$ index.php?page=test&value=$1 

UPDATE(關於你的評論)

如果您使用BASE_URL的概念,則在服務器上創建正確的URL,然後傳遞給瀏覽器。如果您使用<base>,則取決於客戶端(用戶使用的瀏覽器)。在服務器端使用BASE_URL是一種很好的做法,因此您不會依賴客戶端的瀏覽器。

退房這樣的回答:Is it recommended to use the base html tag?

您還可以包括PHP文件(具有define()功能)的所有網頁,因此沒有必要在每個頁面上使用<base>Here is a nice example of using this

1

請務必記住,重寫與重定向不同。瀏覽器不知道正在發生的重寫;它只是看起來像文件夾結構。

網站資源的相對URL由瀏覽器解析。所以,如果你訪問www.example.com/test/x,以及瀏覽器看到<link href="style.css">,它自然讀取此爲www.example.com/test/x/style.css,並試圖要求該文件,只接收404

一個共同的解決方案是始終使用絕對URL像www.example.com/style.css。您很可能會將網站的網址存儲爲常量,並使用<link href="<?php echo SITE_URL; ?>/style.css">

+0

在文件頭中使用''標籤有什麼優點/缺點? – user3420034 2014-09-25 02:36:03

+0

看看我更新的答案。 – 2014-09-25 02:54:02