2014-09-22 103 views
-2

我在重寫url時遇到問題。我爲自己編寫了一個小框架,因爲我不需要爲我的項目提供大量框架的全尺寸框架。我這樣定義Zend框架的一般行爲:[mod_rewrite]:與重定向有關的問題

重寫後的URL:域/控制器/動作

真實路徑:域/ index.php文件CTRL =控制器& ACT =動作

控制器和動作應顯示而不是$ _GET命名鍵。控制器和動作後,如果我添加了無限額外的參數,它應該被添加爲像這樣的鍵/值:

domain/controller/action/key/value/key2/value2/key3/value3 ...

這是我的.htaccess:

RewriteEngine On 
RewriteBase/
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12&$13=$14 [L] 
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8&$9=$10&$11=$12 [L] 
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8&$9=$10 [L] 
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4&$5=$6&$7=$8 [L] 
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act2=$2&$3=$4&$5=$6 [L] 
RewriteRule ^([\w-]+)/([\w-]+)/([\w-]+)/([\w-]+)/?$ index.php?ctrl=$1&act=$2&$3=$4 [L] 
RewriteRule ^([\w-]+)+/([\w-]+)?$ index.php?ctrl=$1&act=$2 [L] 
RewriteRule ^([\w-]+)+/?$ index.php?ctrl=$1 [L] 

網頁只能調用控制器和動作。如果其中一個丟失,用戶將被重定向。我爲此設置標題:

// Redirects 
if (!isset($_GET) || !isset($_GET['ctrl'])) { 
    header('location: /index/index/'); 
} 

if (!isset($_GET['act']) || (isset($_GET['act']) && empty($_GET['act']))) { 
    header("location: /".$_GET['ctrl']."/index/"); 
} 

這很髒我知道。通常它的工作原理,但也有我解決不了的一些問題:

  1. ,如果我嘗試撥打同域的webapp /頁面無法顯示不然我會被重定向與搜索到谷歌「域/」。如果我鍵入域/控制器/行動它的作品。

  2. 如果我在動作之後添加了一個斜線,它將以404結束。它應該與在末尾沒有斜線相同的行爲。如果我在標題路徑前添加一個斜槓('位置:...它適用於以下模式:域/控制器,它將被重定向到域/控制器/操作(在這種情況下,控制器/索引)

但如果我嘗試域/它之前導致404

無斜線:

域/控制器/域/控制器/控制器/行動,但結果域/會正確地重定向到域/索引/索引

我在想什麼? :(

感謝

酪氨酸

+1

哎,請解析URL中的PHP代碼,並簡單地將所有請求轉發到您的PHP文件,而不是使用這樣醜陋的URL ......此外,簡單地映射querystring params包括將他們的名字寫入路徑段不會給你很乾淨的URL ...... – ThiefMaster 2014-09-22 12:41:51

+1

我不知道你的意思是「不是很乾淨」的網址,但是「domain/user/edit/id/3」對我來說很乾淨 – Tyr 2014-09-23 22:50:12

+0

以這個問題的網址爲例。 'http:// stackoverflow.com/questions/25974343/mod-rewrite-problems-with-redirecting'很好,但是在你的系統中它會是例如'http:// stackoverflow.com/questions/id/25974343/title/mod-rewrite-problems-with-redirecting' – ThiefMaster 2014-09-23 22:51:18

回答

0

我想你忘記了這一點:

rewritecond %{http_host} ^yoururl.com/ [nc] 
rewriterule ^(.*)$ http://yoururl.com/$1 [r=301,nc] 

此代碼需要去下:

RewriteBase/
+1

謝謝。我不確定將url添加到.htaccess文件中,但似乎不可避免。它現在有效。 – Tyr 2014-09-23 22:52:11

+0

那麼htaccess需要知道從哪裏重寫..這就是爲什麼網址是必須的.​​. – Naruto 2014-09-24 07:22:46