首页 > 解决方案 > 使用 .htaccees 文件将子域与文件夹匹配

问题描述

我正在创建一个博客平台,每个用户都有自己的网站子域。所以我在想是否可以使用 .htaccess 将用户重定向到他们在 URL 中输入的目录。

我基本上是在寻找一种使用该平台动态创建新博客的解决方案,当它这样做时,它将创建一个新的 laravel 项目,并且该项目将拥有自己的子域。

例如

Blog1.example.com 将显示来自 /blog1/public 的内容

Blog2.example.com 并将显示来自 /blog2/public 的内容

这是可能的还是我应该寻找不同的解决方案?

我正在使用 Apache2 和 laravel

标签: phplaravel.htaccessserverapache2

解决方案


这是可能的。首先,您必须在域注册商/提供商的仪表板中允许/启用通配符子域。然后设置应用程序路由以支持子域路由。

https://laravel.com/docs/7.x/routing#route-group-subdomain-routing

逻辑是你不限制任何请求

anything.example.com

因为你已经启用

*.example.com

在注册商处。如果你的列anything中不存在,你会blogs.slug

然后你通过上面那个链接的文档中显示的 laravel 的子域路由进行这种过滤。

Route::domain('{slug}.example.com')->group(function () {
    Route::get('blog/{slug}', function ($slug) {
        // pseudo code
        //
        // if $slug doesn't exist
        // redirect to some generic or 404 page
    });
    // or
    // Route::get('/blog/{slug}', 'BlogController@show')->name('blog.show');
});

在控制器中你会有类似的东西

BlogController extends Controller
{
    public function show(string $slug)
    {
        $blog = Blog::where(['slug' => $slug])->first();
        return view('blog.show', compact('slug'));
    }
}
// this block is implemented valid way if you use routing call that is commented out `Route::get('/blog/{slug}', 'BlogController@show');` instead anonymous callback function shown before that line in route file. 

您可以实现其他一些事情,例如将 Blog 模型中的 primaryKey 设置为'slug'字段,然后您就可以使用隐式模型绑定public function show (Blog $blog) { /** return $blog */ }等,但这是您可以开始的地方。基本不需要.htaccess改动。


推荐阅读