[mod_rewrite]:重定向问题

时间:2014-09-22 12:37:49

标签: php apache .htaccess mod-rewrite redirect

我在重写网址时遇到问题。我为自己编写了一个小框架,因为我不需要一个包含大量项目的全尺寸框架。我定义了像zend framework这样的一般行为:

重写网址:域/控制器/操作

真实路径:domain / index.php?ctrl = controller& act = action

应显示控制器和操作,而不是$ _GET命名键。在控制器和动作之后如果我添加了无限量的附加参数,它应该被添加为键/值,如下所示:

域/控制器/操作/键/值/键2 /值2 /键3 /值3 ...

这是我的.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.它应该是相同的行为,就像没有斜杠一样。

  3. 如果我在标题中的路径前添加斜杠('位置:...它适用于以下模式:域/控制器。它将被重定向到域/控制器/操作(在此案件管制员/指数)。

  4. 但是,如果我尝试域名/它会产生404。

    之前没有斜线:

    域/控制器/导致域/控制器/控制器/操作但域/将被正确重定向到域/索引/索引

    我缺少什么? :(

    由于

    的Tyr

1 个答案:

答案 0 :(得分:0)

我想你忘了这个:

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

此代码需要包含:

RewriteBase /