2

I need some help.

I want to create a multisite from only one Laravel 5.1 installation. I read multiple .env based on subdomain.

But I want to every site has its own public folder.

So for example with this folders:

-> public -> custom_publics -> user1 -> user2 -> etc 

I can set public_path() but when I try to get it with asset() function doesn’t work.

For example: I have a image.png on http://user2.test.on/custom_publics/user2/image.png. I change public_path() to custom_publics/user2. But when call asset(image.png)gives me http://user2.test.on/image.png and not exists.

There is some way to point to http://user2.test.on/image.png but really goes to http://user2.test.on/custom_publics/user2/image.png ?

Or, how can I set asset() function path?

Any one has tried? Any help?

Regards, Eric.

1

2 Answers 2

3

Ok, I finally get the answer.

Create an AssetsController controller like this:

<?php namespace app\Http\Controllers; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Response; use app\Http\Controllers\Controller; use Redirect; class AssetsController extends Controller { /** * Get asset url and return response based on file type * * @param $filename * @return mixed */ public function data($filename) { $path = public_path().'/'; // You need to change your public path before this $path = $path.$filename; $file = File::get($path); $type = File::mimeType($path); $response = Response::make($file, 200); $response->header("Content-Type", $type); return $response; } } 

So now, I need to change asset helper function. I created a ServiceProvider to make the magic Register under config/app.php:

<?php namespace app\Providers; use Illuminate\Support\ServiceProvider; class SitePathServiceProvider extends ServiceProvider { /** * Indicates if loading of the provider is deferred. * * @var bool */ protected $defer = false; /** * Bootstrap the application services. * * @return void */ public function boot() { // } /** * Reset asset function * * @param $path * @return string */ public function asset($path) { return url('assets/'.$path); } /** * Register the application services. * * @return void */ public function register() { // } } 

The trick is to do a route helper:

Route::get('/assets/{params}', 'AssetsController@data')->where('params', '.*'); 

This route catch all url like:

http://www.example.com/assets/demo.jpg http://www.example.com/assets/uploads/demo.jpg http://www.example.com/assets/large/structure/folder/demo.jpg 

I know it's something complicated, but works like a charm.

King regards

Sign up to request clarification or add additional context in comments.

Comments

1

One way to potentially solve this is by using Apache rewrites so that a request to http://user2.test.on/image.png actually goes to http://test.on/custom_publics/user2/image.png.

RewriteEngine on RewriteCond %{HTTP_HOST} ^(.*)\.test\.on RewriteRule ^(.*)$ http://test.on/custom_publics/%1/$1 [L,NC,QSA] 

You might need to tweak the above example for your specific purpose. See more information here: .htaccess rewrite subdomain to directory

1 Comment

Yes I know that answer, but I need to set multiple sites. I can't create an htaccesswith all sites. I need a dynamic function

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.