我正在尝试将所有传入的请求重定向到/index.php
(除了以?
开头的/?foo=bar
请求
ModRewrite当然可以轻松解决这个问题,但还有其他解决方案吗? 例如,我正在考虑创建一个手动404页面(在PHP中),它将手动重定向到/index.php,但我不确定它是否/如何工作。
在index.php中获取原始URI的信息也很重要,例如当某人请求domain.com/search-term时,我需要index.php中的那些信息(“搜索术语”)。
答案 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获取“搜索术语”
您可以在此处找到更完整的可能重定向变量列表: