2013-03-19 40 views
1

即時建立一個網站有很多參數。目前我使用這個代碼在我的.htaccess文件:Mod重寫 - 有沒有更快的方法?

Options +FollowSymLinks 
RewriteEngine on 
RewriteBase /epo 

RewriteRule (.*)/(.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&param=$4&param2=$5 [QSA] 
RewriteRule (.*)/(.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3&subsite=$4 [QSA] 
RewriteRule (.*)/(.*)/(.*)/$ index.php?section=$1&content=$2&site=$3 [QSA] 
RewriteRule (.*)/(.*)/$ index.php?section=$1&content=$2 [QSA] 
RewriteRule (.*)/$ index.php?section=$1 [QSA] 

RewriteCond %{REQUEST_URI} ^/[^\.]+[^/]$ 
RewriteRule ^(.*)$ http://%{HTTP_HOST}%{REQUEST_URI}/ [R=301,L] 

我是新來的mod_rewrite的,這就是爲什麼這個代碼是一個爛攤子。有沒有更好的方法來處理所有這些參數?最後兩行只是在那裏添加一個「/」在最後如果沒有。如果有人能解釋他們的代碼,這也會很棒,所以我可以理解我做錯了什麼:)

+2

讀我的答案在這裏http://stackoverflow.com/questions/14637335/url-rewriting-in-php-when-several-值正在通過在網址/ 14637516#14637516 – bitWorking 2013-03-19 10:31:52

+0

Downvote是不必要的 - 看起來像一個有效的問題給我。我將上面的鏈接作爲第二個鏈接 - 但是使用上下文 - 這很有幫助,如果您有複雜的規則,並且有機會使用「前端控制器」風格的架構將所有請求重定向到index.php,然後創建例外(例如圖像, JS,CSS等)。 – MyStream 2013-03-19 10:35:31

+0

感謝這個鏈接,但我沒有完全擺脫它:你是什麼意思,「有了這個規則,所有的東西都是爲了index.php而準備的,所以你可以自由地用PHP實現每個url邏輯。」你能給我一個簡單的PHP例子,所以我可以使用你的mod_rewrite代碼? 在此先感謝 – Daniel 2013-03-19 10:35:45

回答

1

我個人將所有請求重定向到單個文件,然後從那裏處理它。

RewriteRule ^(.*)$ index.php?path=$1 [QSA] 

然後在index.php中使用類似

$params = explode('/', $_GET['path']; 

$section = $params[0]; 
$content = $params[1]; 
$site = $params[2]; 
$subsite = $params[3]; 
//etc. 

請記住,你需要的所有參數一些額外的驗證

+0

謝謝,這是處理多個參數的最佳方式?我總是害怕由所有這些參數造成的減速:)另一個問題:我需要什麼其他驗證這些參數? – Daniel 2013-03-19 10:42:18

+0

根據你的設置,'$ params [3]'如果只設置了2個參數就會發出警告。也可以使用常規驗證來確保參數符合您的期望。(數字或字符串,SQL轉義它等) – 2013-03-19 11:13:52

+0

非常感謝,現在我明白了:)我用你的代碼,並使用foreach循環來檢查是否設置了參數。 – Daniel 2013-03-19 11:19:15

1

這是一個類似雨果的例子,但沒有GET PARAM :

<IfModule mod_rewrite.c> 
    SetEnv HTTP_MOD_REWRITE On 
    RewriteEngine On 
    RewriteCond %{REQUEST_FILENAME} -s [OR] 
    RewriteCond %{REQUEST_FILENAME} -l [OR] 
    RewriteCond %{REQUEST_FILENAME} -d 
    RewriteRule ^.*$ - [NC,L] 
    RewriteRule ^.*$ index.php [NC,L] 
</IfModule> 

in PHP你可以做以下事情:

$pathInfo = pathinfo($_SERVER['SCRIPT_NAME']); 
$baseUrl = $pathInfo['dirname']; 
$baseFile = $pathInfo['basename']; 
$url = rtrim(str_replace([$baseUrl, '/'.$baseFile], '', $_SERVER['REQUEST_URI']), '/'); 
$method = strtolower($_SERVER['REQUEST_METHOD']); 
$isModRewrite = array_key_exists('HTTP_MOD_REWRITE', $_SERVER); 

你的URL現在可以看起來像:

http://www.yourserver.com/param1/param2 

OR(如果未啓用國防部重寫)

http://www.yourserver.com/index.php/param1/param2 

在這兩種方式$url變量看起來像/param1/param2

您可以對此字符串執行explode或使用此字符串提供PHP路由庫以提取參數。

PHP路由實例庫:

https://github.com/robap/php-router

https://github.com/deceze/Kunststube-Router

+0

感謝您的代碼,這樣我可以擺脫GET參數以及:)此代碼適用於我。 – Daniel 2013-03-19 11:25:10

相關問題