Configure um bucket para hospedagem de site estático e defina regras de redirecionamento (RoutingRule) para back-to-origin baseado em espelhamento. Após ativar a hospedagem de site estático, as requisições ao site equivalem a requisições diretas ao bucket. Também é possível configurar redirecionamentos automáticos para uma página inicial e uma página de erro específicas. As regras de redirecionamento para back-to-origin baseado em espelhamento facilitam a migração contínua de dados para o Object Storage Service (OSS).
Observações
Este tópico utiliza o endpoint público da região China (Hangzhou). Para acessar o OSS a partir de outros serviços da Alibaba Cloud na mesma região, use um endpoint interno. Para obter detalhes sobre regiões e endpoints suportados, consulte Regiões e endpoints.
Neste tópico, as credenciais de acesso são obtidas de variáveis de ambiente. Para mais informações, consulte Configurar credenciais de acesso.
Este exemplo demonstra a criação de uma instância OSSClient com um endpoint do OSS. Para configurações alternativas, como uso de domínio personalizado ou autenticação com credenciais do Security Token Service (STS), consulte Configuração do cliente.
Para configurar a hospedagem de site estático ou o back-to-origin baseado em espelhamento, você precisa da permissão
oss:PutBucketWebsite. Para recuperar a configuração de hospedagem de site estático ou back-to-origin baseado em espelhamento, é necessária a permissãooss:GetBucketWebsite. Para excluir essa configuração, você deve ter a permissãooss:DeleteBucketWebsite. Para mais detalhes, consulte Conceder políticas de acesso personalizadas a usuários RAM.
Hospedagem de site estático
-
Configure a hospedagem de site estático
O código abaixo mostra como configurar a hospedagem de site estático:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.SetBucketWebsiteRequest; public class Demo { public static void main(String[] args) throws Exception { // The China (Hangzhou) Endpoint is used as an example. Specify the actual Endpoint. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. For example, examplebucket. String bucketName = "examplebucket"; // Specify the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. String region = "cn-hangzhou"; // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release its resources. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Specify the bucket name. SetBucketWebsiteRequest request = new SetBucketWebsiteRequest(bucketName); // Set the default homepage for static website hosting. request.setIndexDocument("index.html"); // Set the default 404 page for static website hosting. request.setErrorDocument("error.html"); ossClient.setBucketWebsite(request); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } } -
Visualize a configuração de hospedagem de site estático
O exemplo a seguir ilustra como visualizar a configuração de hospedagem de site estático:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.BucketWebsiteResult; public class Demo { public static void main(String[] args) throws Exception { // The China (Hangzhou) Endpoint is used as an example. Specify the actual Endpoint. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. For example, examplebucket. String bucketName = "examplebucket"; // Specify the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. String region = "cn-hangzhou"; // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release its resources. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Specify the bucket name. BucketWebsiteResult result = ossClient.getBucketWebsite(bucketName); // View the default homepage and default 404 page of the static website hosting configuration. System.out.println(result.getIndexDocument()); System.out.println(result.getErrorDocument()); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } } -
Exclua a configuração de hospedagem de site estático
Use o código abaixo para excluir a configuração de hospedagem de site estático:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; public class Demo { public static void main(String[] args) throws Exception { // The China (Hangzhou) Endpoint is used as an example. Specify the actual Endpoint. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. For example, examplebucket. String bucketName = "examplebucket"; // Specify the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. String region = "cn-hangzhou"; // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release its resources. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Specify the bucket name. ossClient.deleteBucketWebsite(bucketName); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }
Back-to-origin baseado em espelhamento
O back-to-origin baseado em espelhamento serve principalmente para migrar dados para o OSS sem interrupções. Suponha que seu serviço esteja rodando em um servidor de origem próprio ou em outro produto de nuvem. Ao migrar esse serviço para o OSS visando o desenvolvimento de negócios, garanta que ele continue operando durante a transição. Nesse período, use regras de back-to-origin baseado em espelhamento para buscar dados ainda não transferidos para o OSS e assegurar o funcionamento correto do serviço.
-
Configure o back-to-origin baseado em espelhamento
Por exemplo, quando um solicitante acessa um arquivo inexistente no bucket de destino, especifique condições de back-to-origin e uma URL de origem para recuperar o objeto do servidor original. Imagine que você tenha um bucket chamado examplebucket na região China (Hangzhou). Se alguém tentar acessar um arquivo ausente no diretório examplefolder, localizado na raiz do bucket, e você desejar que o solicitante obtenha esse arquivo a partir do diretório examplefolder do site https://www.example.com/, configure a regra adequadamente.
O código a seguir demonstra como configurar uma regra de back-to-origin baseado em espelhamento para o cenário descrito acima:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.RoutingRule; import com.aliyun.oss.model.SetBucketWebsiteRequest; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Demo { public static void main(String[] args) throws Exception { // The China (Hangzhou) Endpoint is used as an example. Specify the actual Endpoint. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. For example, examplebucket. String bucketName = "examplebucket"; // Specify the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. String region = "cn-hangzhou"; // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release its resources. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { SetBucketWebsiteRequest request = new SetBucketWebsiteRequest(bucketName); // The behavior when an object that does not exist and whose name does not end with a forward slash (/) is accessed. This takes effect after a default homepage is set. //request.setSubDirType(null); // Specifies whether to redirect to the default homepage of a subdirectory when the subdirectory is accessed. //request.setSupportSubDir(false); List<RoutingRule> routingRules = new ArrayList<RoutingRule>(); RoutingRule rule = new RoutingRule(); rule.setNumber(1); // Only objects with this prefix can match this rule. rule.getCondition().setKeyPrefixEquals("examplebucket"); // The rule is matched only if an HTTP status code of 404 is returned for a request to the specified object. rule.getCondition().setHttpErrorCodeReturnedEquals(404); // Specify the redirect type. rule.getRedirect().setRedirectType(RoutingRule.RedirectType.Mirror); // Specify the origin URL for mirroring-based back-to-origin. For example, https://www.example.com/. rule.getRedirect().setMirrorURL("<yourMirrorURL>"); //rule.getRedirect().setMirrorRole("AliyunOSSMirrorDefaultRole"); // Specifies whether to include request parameters when a redirection or mirroring-based back-to-origin rule is executed. rule.getRedirect().setPassQueryString(true); // This parameter has the same function as PassQueryString but has a higher priority. This parameter takes effect only when RedirectType is set to Mirror. rule.getRedirect().setMirrorPassQueryString(true); // Specify the status code to return for the redirection. This parameter takes effect only when RedirectType is set to External or AliCDN. //rule.getRedirect().setHttpRedirectCode(302); // Specify the domain name for the redirection. The domain name must be compliant with domain name specifications. //rule.getRedirect().setHostName("oss.aliyuncs.com"); // Specify the protocol for the redirection. This parameter takes effect only when RedirectType is set to External or AliCDN. //rule.getRedirect().setProtocol(RoutingRule.Protocol.Https); // During redirection, the object name is replaced with the value of ReplaceKeyWith. ReplaceKeyWith supports variables. //rule.getRedirect().setReplaceKeyWith("${key}.jpg"); // If this parameter is set to true, the prefix of the object name is replaced with the value of ReplaceKeyPrefixWith. rule.getRedirect().setEnableReplacePrefix(true); // During redirection, the prefix of the object name is replaced with this value. rule.getRedirect().setReplaceKeyPrefixWith("examplebucket"); // Specifies whether to check the MD5 hash of the back-to-origin body. This parameter takes effect only when RedirectType is set to Mirror. rule.getRedirect().setMirrorCheckMd5(true); RoutingRule.MirrorHeaders mirrorHeaders = new RoutingRule.MirrorHeaders(); // Specifies whether to pass through headers other than the following to the origin server. This parameter takes effect only when RedirectType is set to Mirror. mirrorHeaders.setPassAll(false); List passes = new ArrayList<String>(); passes.add("cache-control"); // Pass through the specified headers to the origin server. This parameter takes effect only when RedirectType is set to Mirror. mirrorHeaders.setPass(passes); List removes = new ArrayList<String>(); removes.add("content-type"); // Prohibit the pass-through of specified headers to the origin server. This parameter takes effect only when RedirectType is set to Mirror. mirrorHeaders.setRemove(removes); List sets = new ArrayList<Map<String, String>>(); Map header1 = new HashMap<String, String>(); header1.put("Key", "key1"); header1.put("Value", "value1"); Map header2 = new HashMap<String, String>(); header2.put("Key", "key2"); header2.put("Value", "value2"); sets.add(header1); sets.add(header2); // Set the headers to pass to the origin server. These headers are set for back-to-origin requests, regardless of whether they are included in the original request. mirrorHeaders.setSet(sets); // Specify the headers to include in back-to-origin requests. This parameter takes effect only when RedirectType is set to Mirror. rule.getRedirect().setMirrorHeaders(mirrorHeaders); routingRules.add(rule); request.setRoutingRules(routingRules); ossClient.setBucketWebsite(request); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } } -
Recuperar a configuração de back-to-origin baseado em espelhamento
Veja abaixo como recuperar a configuração de back-to-origin baseado em espelhamento:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.BucketWebsiteResult; public class Demo { public static void main(String[] args) throws Exception { // The China (Hangzhou) Endpoint is used as an example. Specify the actual Endpoint. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. For example, examplebucket. String bucketName = "examplebucket"; // Specify the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. String region = "cn-hangzhou"; // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release its resources. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { BucketWebsiteResult result = ossClient.getBucketWebsite(bucketName); result.getSubDirType(); // Get the ordinal number of the redirection or mirroring-based back-to-origin rule that is matched and executed. System.out.println(result.getRoutingRules().get(0).getNumber()); // Get the prefix that the rule matches. System.out.println(result.getRoutingRules().get(0).getCondition().getKeyPrefixEquals()); // Get the HTTP status code. System.out.println(result.getRoutingRules().get(0).getCondition().getHttpErrorCodeReturnedEquals()); // Get the suffix that the rule matches. System.out.println(result.getRoutingRules().get(0).getCondition().getKeySuffixEquals()); // Get the redirect type. System.out.println(result.getRoutingRules().get(0).getRedirect().getRedirectType()); // Get the carried request parameters. System.out.println(result.getRoutingRules().get(0).getRedirect().getMirrorPassQueryString()); // Get the origin URL for mirroring-based back-to-origin. System.out.println(result.getRoutingRules().get(0).getRedirect().getMirrorURL()); // Get the status code returned for the redirection. System.out.println(result.getRoutingRules().get(0).getRedirect().getHttpRedirectCode()); // Get the specified headers to pass through. System.out.println(result.getRoutingRules().get(0).getRedirect().getMirrorHeaders().getPass().get(0)); // Get the specified headers that are prohibited from being passed through. System.out.println(result.getRoutingRules().get(0).getRedirect().getMirrorHeaders().getRemove().get(0)); // Get the protocol for the redirection. System.out.println(result.getRoutingRules().get(0).getRedirect().getProtocol()); // Get the domain name for the redirection. System.out.println(result.getRoutingRules().get(0).getRedirect().getHostName()); // Get the value to replace the prefix of the object name during redirection. If the prefix is empty, this string is inserted at the beginning of the object name. System.out.println(result.getRoutingRules().get(0).getRedirect().getReplaceKeyPrefixWith()); // Get the replacement value for the object name specified by ReplaceKeyWith during redirection. ReplaceKeyWith supports variables. System.out.println(result.getRoutingRules().get(0).getRedirect().getReplaceKeyWith()); // Get the status code returned for the redirection. System.out.println(result.getRoutingRules().get(0).getRedirect().getHttpRedirectCode()); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } } -
Exclua a configuração de back-to-origin baseado em espelhamento
Use o exemplo abaixo para excluir a configuração de back-to-origin baseado em espelhamento:
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; public class Demo { public static void main(String[] args) throws Exception { // The China (Hangzhou) Endpoint is used as an example. Specify the actual Endpoint. String endpoint = "https://oss-cn-hangzhou.aliyuncs.com"; // Obtain access credentials from environment variables. Before you run this sample code, make sure that the OSS_ACCESS_KEY_ID and OSS_ACCESS_KEY_SECRET environment variables are set. EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider(); // Specify the bucket name. For example, examplebucket. String bucketName = "examplebucket"; // Specify the region where the bucket is located. For example, if the bucket is in the China (Hangzhou) region, set the region to cn-hangzhou. String region = "cn-hangzhou"; // Create an OSSClient instance. // When the OSSClient instance is no longer needed, call the shutdown method to release its resources. ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // Specify the bucket name. ossClient.deleteBucketWebsite(bucketName); } catch (OSSException oe) { System.out.println("Caught an OSSException, which means your request made it to OSS, " + "but was rejected with an error response for some reason."); System.out.println("Error Message:" + oe.getErrorMessage()); System.out.println("Error Code:" + oe.getErrorCode()); System.out.println("Request ID:" + oe.getRequestId()); System.out.println("Host ID:" + oe.getHostId()); } catch (ClientException ce) { System.out.println("Caught an ClientException, which means the client encountered " + "a serious internal problem while trying to communicate with OSS, " + "such as not being able to access the network."); System.out.println("Error Message:" + ce.getMessage()); } finally { if (ossClient != null) { ossClient.shutdown(); } } } }
Referências
Para acessar o código de exemplo completo sobre hospedagem de site estático e back-to-origin baseado em espelhamento, consulte o exemplo no GitHub.
Para mais detalhes sobre a operação de API usada para configurar hospedagem de site estático ou back-to-origin baseado em espelhamento, consulte PutBucketWebsite.
Para obter mais informações sobre a operação de API usada para recuperar a configuração de hospedagem de site estático ou back-to-origin baseado em espelhamento, consulte GetBucketWebsite.
Para obter mais informações sobre a operação de API usada para excluir a configuração de hospedagem de site estático ou back-to-origin baseado em espelhamento, consulte DeleteBucketWebsite.