Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php [mod_rewrite]:重定向问题_Php_Apache_.htaccess_Mod Rewrite_Redirect - Fatal编程技术网

Php [mod_rewrite]:重定向问题

Php [mod_rewrite]:重定向问题,php,apache,.htaccess,mod-rewrite,redirect,Php,Apache,.htaccess,Mod Rewrite,Redirect,我在重写URL时遇到问题。我为自己编写了一个小框架,因为我的项目不需要一个包含大量内容的完整框架。我定义了zend框架的一般行为: 重写的url:域/控制器/操作 实际路径:domain/index.php?ctrl=controller&act=action 应显示控制器和操作,而不是$\u GET named key。在控制器和操作之后,如果我添加了无限多的附加参数,则应将其添加为键/值,如下所示: 域/控制器/操作/键/值/键2/值2/键3/值3 这是我的.htaccess: Rewrit

我在重写URL时遇到问题。我为自己编写了一个小框架,因为我的项目不需要一个包含大量内容的完整框架。我定义了zend框架的一般行为:

重写的url:域/控制器/操作

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

应显示控制器和操作,而不是$\u GET named key。在控制器和操作之后,如果我添加了无限多的附加参数,则应将其添加为键/值,如下所示:

域/控制器/操作/键/值/键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/");
}
我知道它很脏。一般来说,它是有效的,但有一些问题我无法解决:

  • 如果我尝试使用domain/调用webapp,页面将无法显示,或者我将通过搜索“domain/”重定向到谷歌。如果我输入domain/controller/action,它就会工作

  • 如果我在动作后添加一个尾随斜杠,它将以404结尾。它应该是相同的行为,就像没有斜杠结束

  • 如果我在标题中的路径之前添加斜杠('位置:…它适用于以下模式:域/控制器。它将重定向到域/控制器/操作(在本例中为控制器/索引)

  • 但如果我尝试域/它将导致404

    前无斜杠:

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

    我错过了什么(

    谢谢


    Tyr

    我想你忘了这个:

    rewritecond %{http_host} ^yoururl.com/ [nc]
    rewriterule ^(.*)$ http://yoururl.com/$1 [r=301,nc]
    
    此代码需要在以下条件下运行:

    RewriteBase /
    

    呃,请在你的PHP代码中解析URL,并简单地将所有请求转发到你的PHP文件,而不是使用这样丑陋的URL…此外,简单地将查询字符串参数(包括它们的名称)映射到路径段将不会给你提供非常干净的URL…我不知道你所说的“不太干净”URL是什么意思,而是“域/用户/编辑/id/3”以meTake的url为例,看起来非常干净。
    http://stackoverflow.com/questions/25974343/mod-rewrite-problems-with-redirecting
    很好,但如果使用您的系统,则会很好,例如
    http://stackoverflow.com/questions/id/25974343/title/mod-rewrite-problems-with-redirecting
    谢谢。我不确定是否将url添加到.htaccess文件,但它似乎是不可避免的。它现在可以工作了。好吧,htaccess需要知道从哪里重写..这就是为什么url是必须的。。