2012-10-23 31 views
0

我希望答案會是這麼簡單,我會哭,但我似乎無法弄清楚。我是mod_rewrite的新手。如何阻止mod_rewrite將鏈接追加到url?

我想改變我的鏈接,如domain.com/?p=about到domain.com/about* / *(帶有斜線),它工作正常,但每當我移動到一個鏈接,它會將新鏈接附加到網址的後面。例如,我有一個關於和一個聯繫鏈接。如果我點擊它導航到domain.com/about/,那麼如果我點擊聯繫人,它將導航到domain.com/about/contact/,並將繼續添加鏈接到URL的末尾。如果我在domain.com並點擊鏈接(在這種情況下),它將轉到domain.com/about/,如果我再次點擊4次,我的地址欄會顯示「domain.com/ about/about/about/about/about /「我在下面的一個非常簡單的例子中轉載了這個,我做錯了什麼?

的.htaccess

RewriteEngine On 
RewriteRule ([a-zA-Z0-9]+)/$ index.php?p=$1 

的index.php

<a href="about/">about</a> | <a href="contact/">contact</a><br><br> 

<?php 
    if(!isset($_GET['p'])) { 
     echo "home"; 
    } else { 
     echo $_GET['p']; 
    } 
?> 

謝謝您的幫助!

編輯: 如果我使用絕對路徑,它可以正常工作,但我寧願不,如果我不必絕對必須。

EDIT2:添加

RewriteBase/

斷裂的鏈接。他們似乎要去domain.com/about/和.../contact /,但我得到一個404 - 我假設我使用的規則與我進行鏈接的方式有點不相容,這就是爲什麼我也包括index.php。

+0

如何只在其他兩條線之間增加一個'RewriteBase /'在你的'.htaccess'中? – Havelock

+0

@Havelock:我也試過,但那時鏈接不再起作用。 – sdouble

+0

然後可能看看你是如何建立你的網頁上的鏈接......(無論標籤用戶名o.O發生了什麼) – Havelock

回答

1

您正在定義HTML中相對於當前路徑的所有鏈接。

你需要改變你的鏈接,使得:

<a href="about/">about</a> | <a href="contact/">contact</a><br><br> 

成爲(注意龍頭/上的URL):

<a href="/about/">about</a> | <a href="/contact/">contact</a><br><br> 

當你是一個頁面site.com/about/us<a href="home/"一個鏈接通過瀏覽器解析爲site.com/about/us/home

解決方案是更改您的所有鏈接,圖像,樣式表和JavaScript,以在您的網址中使用絕對路徑,而不是像現在這樣的相對路徑。

編輯:只注意到你的編輯。你真的應該使用絕對路徑,而不是相對路徑。如果你想保留相對的URL,那麼你必須在你所有的頁面上使用類似<base href="/" />的東西。

+0

決定使用絕對路徑(與腳本,將爲我設置的路徑)。我正在遠離它,所以在開發和生產過程中我不必擔心它。服務器根據我當天的工作情況而有所不同,而且我不希望在開發過程中每次都改變路徑。 – sdouble

+1

如果所有的HTML都是硬編碼的,那麼它可能是一個問題。如果您使用的是Web框架,他們通常會提供一種自動確定基本路徑的機制,以便您的所有網址都是可移植的。如果您正在創建自己的PHP站點,則可以定義一個應用程序範圍變量,該變量包含站點的基本URL,然後在創建所有鏈接時使用該值。 – drew010

+0

這就是我所做的,使用一個基於它運行在哪個服務器上的全局變量(生產,本地主機等等) – sdouble

1

無論你做什麼,點擊<a href="about/">about</a>將在URL的末尾附加about/。這就是相關鏈接的工作原理。

你的選擇是,在見識的順序:

  1. 只是刪除結尾的斜線。這是你的問題的原因:

    <a href="about">about</a> 
    

    相對鏈接將與您的新值替換路徑的最後部分(最後/後)。

  2. 添加上一個../。這是一個有點哈克,但它可以讓你保持有價值的尾隨斜線

    <a href="../about/">about</a> 
    
  3. 做301重定向從/about/about到​​。這將導致地址欄從​​更改爲/about/about並再次返回。

1

也許有點來不及回答,但添加在<head>節這一行會做的伎倆:

<base href="/"> or <base href="your-domain-name">