I have a Laravel API for a social media like website. The API is consumed by a fully separate React app on the frontend. Everything works fine with the API.
I have many profile images of the users stored inside ‘public’ directory organized in folders. Below is the directory structure:
MyAppRoot
├── app
├── ....
├── public
│ └── folder1
| | └── img1.png
| | └── img2.png
│ └── folder2
| └── img1.png
| └── img2.png
└── resources
└── routes
└── ....
When I access the image directly using the URL https://myapp.com/folder1/img1.png
in the browser, I can see the image but when I use the same image URL in the html file as img source <img src="https://myapp.com/folder1/img1.png"/>
I get the below error in my browser console.
GET https://myapp.com/folder1/img1.png net::ERR_BLOCKED_BY_RESPONSE.NotSameOrigin 200
I can access all images in all directories without any issues while accessed directly but get the same error if I try to embed any of the images in a html file.
I searched a bit and found that it is due to CORS policy, and I tried adding the folders in conf/cors.php
paths as below:
'paths' => ['api/*', 'sanctum/csrf-cookie', 'broadcasting/auth', 'public/*'],
AND
'paths' => ['api/*', 'sanctum/csrf-cookie', 'broadcasting/auth', 'public/**/*'],
AND
'paths' => ['api/*', 'sanctum/csrf-cookie', 'broadcasting/auth', 'forlder1/*'],
Unfortunately, none of these worked.
After searching a bit more, I found somewhere that the static files are not processed by Laravel but are directly served by Apache. So, I tried adding below lines in .htaccess
file in the root of the app and also inside public directory of the app:
<IfModule mod_setenvif.c>
<IfModule mod_headers.c>
<FilesMatch ".(bmp|cur|gif|ico|jpe?g|png|svgz?|webp|pdf)$">
Header set Access-Control-Allow-Origin "*" env=IS_CORS
</FilesMatch>
</IfModule>
</IfModule>
But again, these too didn’t work.
I also tried adding this code in Apache config file httpd.conf
too but I couldn’t make it work.
I couldn’t find any more solutions to the problem and also, I am still not sure what is the exact problem here.
2
Answers
I finally found the solution. As stated by Heiko Theißen in the answer, the resources were not loading due to the response header
Cross-Origin-Resource-Policy: same-origin
.The solution was to respond with the header
Cross-Origin-Resource-Policy: cross-origin
from the server.I added below lines in my
.htaccess
file inside my/public
directory and everything worked great. I added some pattern matching to avoid other security issues and add the header only when the request is for some static files.I have added pdf and different types of images and fonts extension in match pattern to allow variety of static files.
The header
Cross-Origin-Resource-Policy: same-origin
instructs your browser not to load resources (such as images) from a different origin.If you do not want to (or cannot) change this header, which comes from your server, you can set up your Apache server as a reverse proxy to
myapp.com
so that the browser requests the image locally, from/images/folder1/img1.png
, and Apache forwards this request to https://myapp.com/folder1/img1.png.