2012-08-14 24 views
0

當我的客戶端向網站添加頁面時,新的頁面名稱應該附加到RewiteRule正則表達式中。因此,例如fwrite(),我希望PHP使用從數據庫收回的值更改RewiteRule正則表達式。如果可以這樣做,這個過程中是否存在缺陷?是否可以使用數據庫值構建RewriteRule正則表達式?

編輯:在PHP腳本處理將是解決辦法,如果有would'nt更給它... 第一個域/ index.php頁面=頁面名稱是301重定向到「域/網頁」 來警告訪問者這個頁面永久移動 - (這是舊的 公共位置的URL,應該給這301)。然後請求 ,如「domain/pagename」(新的公共位置),將默認爲 ,內部重寫爲domain/index.php?page = pagename,其中 驗證發生,並且404無效時給出。但只是 關鍵字(頁面= pagename的「頁面」部分)是靜態的,可以驗證 ,並且會直接從.htaccess中提供404。現在, 請求像domain/index.php?page = crap將首先很好地給出一個301 像有效的domain/index.php?page = pagename那樣,並且只有當 到達index.php時纔可以被識別爲廢話。因此,仍然需要從數據庫中獲取頁面名稱到.htaccess中。

這是內容提供一些背景,這個問題.htacces的樣本:

ErrorDocument 404 http://localhost/testsite/404.php 

RewriteEngine on 
RewriteBase /testsite/ 

## block craprequests without extension like domain/crap > 404 
# The requests domain/pagename that do not go to existing pages, will now be redirected with a 302 to index.php?page=pagename and only then give a 404 through the errorcheck in the code. 
# This should be done here, with a RewriteCond regex with database content 
RewriteCond %{REQUEST_URI} !404.php$ 
RewriteRule .* 404.php [R=404,L] 

## block-direct-queries ## 
RewriteCond %{QUERY_STRING} !marker=1$ 
RewriteCond %{QUERY_STRING} page=(.*) 
RewriteRule ^.*$ %1? [R=301,L] 


## strip-extensions ## 
RewriteCond %{QUERY_STRING} !. 
RewriteCond %{REQUEST_URI} !404.php$ 
RewriteRule ^([\w+%*\d*\+*\-*]+)\.(php[\s]{0,3}|htm[\s]{0,3}|html[\s]{0,3})$ $1 [R=301,L] 

## put-querystring 
RewriteRule ^([\w\-_]+)\/?$ index.php?page=$1&marker=1 [L] 
+0

是的,你可以做到這一點(這並不容易,但你可以做到) – Oussama 2012-08-14 11:32:25

+0

請詳細說明。包括一個'.htaccess'樣本,以及樣本在修改後的樣子。 – Tomalak 2012-08-14 11:34:39

+1

聲音就像通用重寫規則,通過PHP控制器腳本路由所有內容就是答案,而不是每次修改站點佈局時都修改.htaccess(它也具有相當高的安全性)。 – DaveRandom 2012-08-14 11:35:22

回答

1

這很可能會是可能的(雖然寫的權限,可能是一個問題)。但是,通過index.php文件路由所有來自客戶端的請求並讓PHP處理路由不是更好的方法。

這樣你就可以最大限度地靈活,你不必做「哈克」的東西。

編輯

所有形式的重定向可以從PHP來完成。例如。一個301重定向的例子:

header ('HTTP/1.1 301 Moved Permanently'); 
header ('Location: http://example.com/new/path'); // note the full address 
exit(); 

請參閱the manual有關使用header()更多信息。

+0

問題是,當你第一次捕獲類似於domain/pagename的URL請求時,這是不可能的,然後用RewriteRule默認地將它們重寫爲domain/index.php?page = pagename。你必須知道允許哪些頁面來自.htaccess,否則廢話請求像域/廢話也會重定向,而我希望那些提供404狀態。 – 2012-08-14 11:39:47

+0

@ C.A.Vuyk所以從PHP(['header()'](http://php.net/manual/en/function.header.php))給出404。每次您更改網站時,要比修改.htaccess要容易得多。 – DaveRandom 2012-08-14 11:44:18

+0

你說得對,它更容易。情況是,由於重寫,任何形式的domain/pagename首先給出狀態302,而錯誤的應立即給404。 – 2012-08-14 11:58:54

2

我很抱歉不斷重複這件事給你,但沒有必要在.htaccess中存儲頁面名稱。這一切都可以在PHP中更簡單地完成。

你唯一需要的重寫規則是這樣的:

RewriteCond %{REQUEST_URI} !^/?index\.php$ 
RewriteRule .* /index.php [L,QSA] 

現在,在PHP中,你可以做這樣的事情:

// The important point here is that $_SERVER['REQUEST_URI'] contains the actual 
// path the user typed into their browser, which is what you are interested in 

if (strtolower(basename(parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH))) === 'index.php') { 
    // The user directly requested index.php 
    if (!empty($_GET['page']) || value_of_page_is_crap()) { 
     // The user requested a bad page 
     header("{$_SERVER['SERVER_PROTOCOL']} 404 Not Found"); 
    } else { 
     // Redirect to correct URL 
     header("{$_SERVER['SERVER_PROTOCOL']} 301 Moved Permanently"); 
     header("Location: http://{$_SERVER['HTTP_HOST']}/{$_GET['page']}"); 
    } 
    exit; 
} 

// The request is allowed to continue 
$requestedPage = pathinfo($_SERVER['REQUEST_URI'], PATHINFO_FILENAME); 

的的.htaccess將路由盲目每一個請求通過PHP ,其中可以使用比mod_rewrite的笨重的基於PCRE的規則更精確的邏輯。

PHP腳本檢查用戶在瀏覽器中的地址欄中鍵入的URI。如果他們直接請求index.php,它將檢查$_GET['page']是否包含合理的值,如果是,則將它們重定向到正確的URL,如果不是用404響應。如果用戶沒有直接請求index.php,則腳本可以繼續。我添加了一個示例行來顯示您如何從提取他們所請求的頁面的值,但您從這裏繼續的方式取決於您。

+0

你是對的!非常感謝解釋。這可以通過更多的方式來完成,所以我明白了。我會給你的接受,但PeeHaa是第一個,現在upvoted。 – 2012-08-15 11:39:37

相關問題