Apache - 无需Mod_Rewrite重定向所有流量

时间:2014-01-03 18:26:05

标签: php apache

我正在尝试将所有传入的请求重定向到/index.php(除了以?开头的/?foo=bar请求

ModRewrite当然可以轻松解决这个问题,但还有其他解决方案吗? 例如,我正在考虑创建一个手动404页面(在PHP中),它将手动重定向到/index.php,但我不确定它是否/如何工作。

在index.php中获取原始URI的信息也很重要,例如当某人请求domain.com/search-term时,我需要index.php中的那些信息(“搜索术语”)。

2 个答案:

答案 0 :(得分:1)

您需要使用某种路由组件,例如框架中存在的路由组件来处理重定向所有路由。例如,如果你使用laravel 4,你可以在routes.php文件中执行类似的操作:

    Route::any('/', function(){
        //Do Magic Stuff
    });

    Route::any('{all}', function($uri)
    {
        //Check query string here - redirect as necessary
        if (stripos($_SERVER['QUERY_STRING'], '?') !== false)
            //Redirect or do stuff depending on your use case
        else
            Redirect::to('/'); //Otherwise redirect to your homepage
    })->where('all', '.*');

all将匹配所有路线并将它们重定向到第一条路线,这是您的默认路线。有很多PHP框架,你可以用它们甚至可以从头开始 - 这只是一个我认为很适合使用的框架。

归功于杰森刘易斯:Get all routes, Laravel 4
Laravel Routing:http://laravel.com/docs/routing

答案 1 :(得分:1)

有趣的问题。甚至像laravel这样的框架也需要RewriteRule在从框架内部进行任何路由之前将请求推送到index.php。

我觉得要抓一切,因为你建议需要进行一些Apache配置更改。

你建议将404页面重定向到index.php会起作用,但SEO的含义可能会很糟糕。除了index.php之外,任何指向您网站的链接都会在HTTP标题中显示404 Not Found错误(即使它显示的是index.php)。

但是......尽管如此,如果你仍然想这样做,那么你是怎么做的:

在.htaccess中

ErrorDocument 404 /index.php

这将使您的404找不到页面index.php

你的重定向变量将在$ _SERVER数组中,并以REDIRECT _为前缀

的print_r($ _ SERVER);从重定向给我(我删除了开头没有REDIRECT_的任何键值对):

Array
(
    [REDIRECT_REQUEST_METHOD] => GET
    [REDIRECT_STATUS] => 404
    [REDIRECT_URL] => /blsah.html
)

因此REDIRECT_URL将用于从domain.com/search-term获取“搜索术语”

您可以在此处找到更完整的可能重定向变量列表:

http://httpd.apache.org/docs/2.2/custom-error.html