Host a static website on an Object Storage Service (OSS) bucket and configure mirroring-based back-to-origin rules to seamlessly migrate data to OSS.
Prerequisites
Before you begin, ensure that you have:
An OSS bucket
The required permissions:
oss:PutBucketWebsiteto configure static website hosting or mirroring-based back-to-originoss:GetBucketWebsiteto query configurationsoss:DeleteBucketWebsiteto delete configurations
For more information, see Attach a custom policy to a RAM user
Usage notes
The sample code uses the region ID
cn-hangzhoufor the China (Hangzhou) region. By default, a public endpoint is used to access resources in a bucket. To access resources from other Alibaba Cloud services in the same region, use an internal endpoint. For more information, see Regions and endpoints.
Static website hosting
Static websites consist entirely of static content, including client-side scripts such as JavaScript. Use static website hosting to serve your website directly from an OSS bucket.
Configure static website hosting
The following example sets index.html as the default homepage and error.html as the default 404 page:
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
// Command line parameter descriptions.
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
"bucket" => ['help' => 'The name of the bucket', 'required' => True],
];
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help";
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
// Load credentials from environment variables.
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
// Configure static website hosting.
$request = new Oss\Models\PutBucketWebsiteRequest(bucket: $bucket,
websiteConfiguration: new Oss\Models\WebsiteConfiguration(
indexDocument: new Oss\Models\IndexDocument(
suffix: 'index.html', // Default homepage
supportSubDir: true, // Enable subdirectory homepage
type: 0 // Index page type
),
errorDocument: new Oss\Models\ErrorDocument(
key: 'error.html', // Default 404 page
httpStatus: 404 // HTTP status code
)
)
);
$result = $client->putBucketWebsite($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId
);Query static website hosting configurations
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
"bucket" => ['help' => 'The name of the bucket', 'required' => True],
];
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help";
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
$request = new Oss\Models\GetBucketWebsiteRequest(bucket: $bucket);
$result = $client->getBucketWebsite($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId . PHP_EOL .
'website config:' . var_export($result->websiteConfiguration, true) . PHP_EOL
);Delete static website hosting configurations
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
"bucket" => ['help' => 'The name of the bucket', 'required' => True],
];
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help";
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
$request = new Oss\Models\DeleteBucketWebsiteRequest(bucket: $bucket);
$result = $client->deleteBucketWebsite($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId
);Mirroring-based back-to-origin
Mirroring-based back-to-origin seamlessly migrates data to OSS without service interruptions. When a requested object does not exist in the bucket, OSS retrieves it from the specified origin and returns it to the requester.
Configure mirroring-based back-to-origin rules
The following example configures a mirroring-based back-to-origin rule: when a requester accesses an object prefixed with myobject in the bucket and the object does not exist (HTTP 404), OSS retrieves the object from http://www.test.com/.
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
"bucket" => ['help' => 'The name of the bucket', 'required' => True],
];
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help";
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
// Define a mirroring-based back-to-origin rule.
$ruleOk = new Oss\Models\RoutingRule(
ruleNumber: 1,
condition: new Oss\Models\RoutingRuleCondition(
keyPrefixEquals: 'myobject', // Object name prefix to match
httpErrorCodeReturnedEquals: 404 // Trigger on HTTP 404
),
redirect: new Oss\Models\RoutingRuleRedirect(
redirectType: 'Mirror', // Redirection type
mirrorURL: 'http://www.test.com/', // Origin URL
mirrorHeaders: new Oss\Models\MirrorHeaders(
passAll: false, // Do not pass all HTTP headers
passs: ['myheader-key1', 'myheader-key2'], // Headers to pass
removes: ['myheader-key3', 'myheader-key4'], // Headers to remove
sets: [
new Oss\Models\MirrorHeadersSet(
key: 'myheader-key5', // Custom header name
value: 'myheader-value' // Custom header value
),
]
)
)
);
$request = new Oss\Models\PutBucketWebsiteRequest(
bucket: $bucket,
websiteConfiguration: new Oss\Models\WebsiteConfiguration(
indexDocument: new Oss\Models\IndexDocument(
suffix: 'index.html',
supportSubDir: true,
type: 0
),
errorDocument: new Oss\Models\ErrorDocument(
key: 'error.html',
httpStatus: 404
),
routingRules: new Oss\Models\RoutingRules(
routingRules: [$ruleOk]
)
)
);
$result = $client->putBucketWebsite($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId . PHP_EOL .
'website config:' . var_export($result->websiteConfiguration, true) . PHP_EOL
);Query mirroring-based back-to-origin rules
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
"bucket" => ['help' => 'The name of the bucket', 'required' => True],
];
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help";
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
$request = new Oss\Models\GetBucketWebsiteRequest(
bucket: $bucket,
);
$result = $client->getBucketWebsite($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId . PHP_EOL .
'website config:' . var_export($result->websiteConfiguration, true) . PHP_EOL
);Delete mirroring-based back-to-origin rules
<?php
require_once __DIR__ . '/../vendor/autoload.php';
use AlibabaCloud\Oss\V2 as Oss;
$optsdesc = [
"region" => ['help' => 'The region in which the bucket is located.', 'required' => True],
"endpoint" => ['help' => 'The domain names that other services can use to access OSS.', 'required' => False],
"bucket" => ['help' => 'The name of the bucket', 'required' => True],
];
$longopts = \array_map(function ($key) {
return "$key:";
}, array_keys($optsdesc));
$options = getopt("", $longopts);
foreach ($optsdesc as $key => $value) {
if ($value['required'] === True && empty($options[$key])) {
$help = $value['help'];
echo "Error: the following arguments are required: --$key, $help";
exit(1);
}
}
$region = $options["region"];
$bucket = $options["bucket"];
$credentialsProvider = new Oss\Credentials\EnvironmentVariableCredentialsProvider();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider($credentialsProvider);
$cfg->setRegion($region);
if (isset($options["endpoint"])) {
$cfg->setEndpoint($options["endpoint"]);
}
$client = new Oss\Client($cfg);
$request = new Oss\Models\DeleteBucketWebsiteRequest(
bucket: $bucket,
);
$result = $client->deleteBucketWebsite($request);
printf(
'status code:' . $result->statusCode . PHP_EOL .
'request id:' . $result->requestId
);References
Complete sample code on GitHub: PutBucketWebsite.php, GetBucketWebsite.php, DeleteBucketWebsite.php
API reference: PutBucketWebsite, GetBucketWebsite, DeleteBucketWebsite