Keywords: CORS | Cross-Origin Resource Sharing | Preflight Request | Access-Control-Allow-Origin | Server Configuration
Abstract: This technical paper provides an in-depth analysis of the common 'No Access-Control-Allow-Origin header' error in cross-origin requests, explaining the CORS mechanism, preflight request processing, and complete server-side configuration solutions. By contrasting incorrect client-side configurations with proper server implementations, it helps developers fundamentally understand and resolve cross-origin access issues.
In-depth Analysis of CORS Error Mechanisms
In modern web development, Cross-Origin Resource Sharing (CORS) is a critical security mechanism. When browsers detect cross-origin requests, they automatically enforce same-origin policy restrictions. If the server is not properly configured with CORS headers, this triggers the "No 'Access-Control-Allow-Origin' header is present on the requested resource" error.
Core Function of Preflight Requests
For non-simple requests, browsers first send an OPTIONS method preflight request. The preflight request includes headers like Access-Control-Request-Method and Access-Control-Request-Headers to inquire whether the server permits the actual request's method and headers. The server must correctly respond to the preflight request with appropriate CORS headers before the browser proceeds with the actual request.
Common Misconceptions in Client-Side Configuration
Many developers mistakenly set CORS headers in client-side code, as shown in this erroneous example:
$.ajax({
url: 'http://localhost:8080/app',
type: 'POST',
headers: {
'Access-Control-Allow-Origin': 'http://localhost:8080'
},
data: JSON.stringify(arr[0])
});
This configuration is completely ineffective because CORS headers must be set on the server side. Browsers ignore these client-set headers due to security design considerations.
Proper Server-Side Configuration Solutions
According to best practices, CORS configuration must be implemented on the server side. Below are configuration methods for different technology stacks:
Apache Server Configuration
Add to the .htaccess file:
Header set Access-Control-Allow-Origin "*"
Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
Header set Access-Control-Allow-Headers "Content-Type, Authorization"
Spring Framework Configuration
Using the @CrossOrigin annotation:
@RestController
@CrossOrigin(origins = "http://localhost:8080")
public class MyController {
// Controller methods
}
Slim Framework Middleware Configuration
Referencing the implementation pattern from supplementary materials:
$app->add(function ($req, $res, $next) {
$response = $next($req, $res);
return $response
->withHeader('Access-Control-Allow-Origin', '*')
->withHeader('Access-Control-Allow-Headers', 'x-requested-with, Content-Type, Accept, Origin, Authorization')
->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');
});
Special Handling for Preflight Requests
OPTIONS method preflight requests require separate handling. As seen in the Slim framework configuration:
$app->options('/{routes:.+}', function ($request, $response, $args) {
return $response;
});
This configuration ensures preflight requests receive proper CORS header responses.
Security Considerations and Best Practices
While using the wildcard * can quickly resolve issues, production environments should explicitly specify allowed domains:
Access-Control-Allow-Origin: https://trusted-domain.com
Additionally, precisely configure allowed methods and headers based on actual requirements to avoid security risks from over-authorization.
Debugging and Troubleshooting
When encountering CORS errors, you should:
- Check the network panel in browser developer tools to confirm details of preflight and actual requests
- Verify that the server correctly returns all required CORS headers
- Ensure preflight request handling logic is correct, especially for OPTIONS method processing
- Test different request methods and content types to confirm configuration completeness
By deeply understanding the CORS mechanism and properly configuring the server side, developers can effectively resolve cross-origin access issues and build more robust web applications.