2013-03-25 155 views
0

正如我以前的問題可能已經告訴你,我不是很好modrewrite。我試圖搜索併爲這個特定問題空洞起來。我希望有人能幫助我解決這個問題。衝突Modrewrite規則

我使用modrewrite作爲短URL生成器的一部分,直接訪問唯一ID會將它們轉發到目標。添加/ v到結束將允許一個門戶網站頁面,將顯示它們被轉發到的URL(如預覽頁面)

因爲/ v後面的ID,它工作得很好,但我想允許通過新增網頁$ _GET

這是給予用戶的快捷鏈接;

javascript:void(location.href='http://www.website.com/n/?url='+location.href) 

這是htaccess的

RewriteEngine On 

RewriteRule ^n actions.php?do=new [NS,L,NC] 
RewriteRule ^([a-zA-Z0-9]+)$ actions.php?id=$1 [NC] 
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ actions.php?id=$1&do=$2 [NC] 

的內容的問題: 因爲/N是代替ID,它顯然衝突。我已經嘗試過NS和L,因爲它們能夠在規則匹配後停止執行。經過進一步檢查,他們當然沒有按照我的意願工作。

最後,這裏是一些如何在最終產品中尋找URL的例子;

New Submission: 
http://www.web.com/n/?url=http://www.google.com  [Outputs new URL as 12345] 
    Visit the ID directly: 
http://www.web.com/1A2b34D5      [Forwards to URL Destination] 
    Visit the ID Preview Link: 
http://www.web.com/1A2b34D5/v    [Displays preview, Delayed Forwarder] 

回答

1

如果你想從查詢字符串中url變量只是添加QSA的選項,它會保存網址$_GET['url']

RewriteEngine On 

RewriteCond %{REQUEST_FILENAME} !-f # if the url file does not exist 
RewriteRule ^n/?$ actions.php?do=new [NS,L,NC,QSA] 
RewriteRule ^([a-zA-Z0-9]+)$ actions.php?id=$1 [NC,L] 
RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ actions.php?id=$1&do=$2 [NC,L] 

另外,在你的行動。PHP的,你必須把條件:

if (isset($_GET['do'])) 
{ 
    if ($_GET['do'] == 'new') // http://www.web.com/n/?url=http://www.google.com 
    { 
     if (!isset($_GET['url'])) die('No url'); 

     // save the url 
     // and outputs new URL 
    } 
    else if ($_GET['do'] == 'v') // http://www.web.com/1A2b34D5/v 
    { 
     // Visit the ID Preview Link 
    } 
} 
else // http://www.web.com/1A2b34D5 
{ 
    // Visit the ID directly 
} 

編輯:

我不知道它是怎麼回事,但就像我在我的評論說,我在本地主機已經測試和它的作品,你預計,在我的測試中,我有這個內容var_dump($_GET);一個test.php即使我創建了一個actions.php文件具有相同的內容,這裏是我測試過的一些URL示例:

例1:

http://localhost/n?url=google.comhttp://localhost/n/?url=google.com

此規則被執行:

RewriteRule ^n/?$ actions.php?do=new [NS,L,NC,QSA]

輸出:

array(2) { ["do"]=> string(3) "new" ["url"]=> string(10) "google.com" }

例2:

http://localhost/n12345輸出:array(1) { ["id"]=> string(6) "n12345" } http://localhost/nnnn456輸出:array(1) { ["id"]=> string(6) "nnnn456" }

被執行此規則:

RewriteRule ^([a-zA-Z0-9]+)$ actions.php?id=$1 [NC,L]

示例3:

http://localhost/n12345/v輸出:array(2) { ["id"]=> string(6) "n12345" ["do"]=> string(1) "v" }

此規則被執行:

RewriteRule ^([a-zA-Z0-9]+)/([a-zA-Z0-9]+)$ actions.php?id=$1&do=$2 [NC,L]

+0

提供將包括在混合品種下限,上限和數字值的字符串。這只是一個例子,目前確實有效。我對此模糊不清,並會相應調整。 – Tarquin 2013-03-25 02:20:07

+0

解答已更新! – tttony 2013-03-25 02:35:17

+0

非常感謝,但問題依然存在,它認爲/ n是需要重定向的URL。示例(離線數據庫)www.agn.im/n/?url=http://www.google.com/ – Tarquin 2013-03-25 03:34:22