Hi I am trying to provide access to a folder of photos. The website is Unix based so I can change permissions. I am using WISE-FTP 8 as my FTP program. I created a directory on the server and intend to upload about 40 photos to it. I uploaded one photo as a test and received a 403 Forbidden. The directory is set to public read.

Dani AI

Generated

Quick summary and practical follow-ups based on the thread: the root causes were twofold — the script was emitting filesystem paths instead of browser-accessible URLs, and the webserver refused access because of permissions/config. ’s listing approach exposed the path problem, and ’s permission changes proved the server-side restriction. The checklist below covers safe fixes and tests that work on most Unix web hosts.

Confirm web path vs filesystem path

  • In a browser try the image URL directly (for example: ). If that fails, the link your script emits is probably the server filesystem path (/home/...) rather than a web URL or a relative path. Scripts must output web paths (or relative filenames) so the browser can fetch them.

Quick permission / ownership checks (run on the server)

ls -l images

If ownership or mode is wrong, fix with (replace webuser:webgroup with your webserver/account user):

chown -R webuser:webgroup images
chmod 755 images
chmod 644 images/*.jpg

Notes: directories need the execute bit to allow traversal. Avoid leaving directories world-writable (777) — that “fix” often hides an ownership problem.

If permissions look correct but access is still denied

  • Inspect .htaccess for deny rules (e.g., "Deny from all" or "Require all denied") and Apache/Nginx config (Options Indexes, DirectoryIndex).
  • Check server error logs (host control panel or /var/log/apache2/error.log) for the 403 explanation.
  • On SELinux systems check and set web content context:
    ls -Z images
    chcon -R -t httpd_sys_content_t images
  • On shared hosts using suPHP/mod_suexec, files must be owned by your account and not group/others-writable.

Security and cleanup

  • Once working, revert any overly permissive modes, remove temporary listing scripts if not needed, and avoid publishing internal log files or full server paths. These small hardening steps keep the site accessible and reduce future 403 surprises.

Recommended Answers

All 16 Replies

Is the folder of photos within a server directory (htdocs or www)?

If so, you can create folder, put your pictures in it, and then refer your visitors to the folder. Keep in mind to not create any home, index or default page. As soon as server doesn't have these files, it will list every file in that directory. In such form (a little bit outdated):
http://www.askdavetaylor.com/0-blog-pics/apache-directory-listing.png

In case, when the folder is out of the reach of htdocs or www. You could go to folder where you have your images (for example cd /home/me/), then use ll commands and ls -l or ll. And give us your output.

Your directory may be free to be read by public, but your files may not be.

Alternatively you could always make index.php with:

$imgdir = "PATH_TO_YOUR_IMAGES_FOLDER";
$images = glob($imgdir . "*.jpg");

foreach($images as $linkto) {
    echo "<a href=$linkto>".basename($linkto)."</a><br />";
}

This code is not yet tested so it may not work perfectly well. Try to put this into your images file.

Thanks Aeonix

Its an htdocs (Fasthosts hosted) I have created the folder and uploaded it to my website but it won't allow me to open it in a browser. The folder only has at present one jpg file. Shall I try to add the your index file as you suggest to the image folder?

Thanks Geoff

Yes, try this, if you configure file correctly (that is, modifying paths and names), it should be able to see all the files and list their links and by clicking those links, you will be sent to these photos.

If this wouldn't work, I suggest we may use TeamViewer to solve your issue. It's a program that would temporarily allow me control of mouse and keyboard, I would then be able to set up basic "file reader" and I would let you work onward with it.

If you're interested in that solution, download and install it and pass me the number and PIN (of the program) through private message. Don't be worried, if you feel like I'm bluffing or doing something wrong that I wasn't supposed to do, it's as easy as closing window.

Thanks. I have got as far as the jpg file being listed in the browser window using your code. Its address is mywebsite/images which is correct. If I click the link I get a message: Not Found The requested URL . . .was not found on this server. In the browser's address Go To Box the website path is displayed but starts from the website's URL and adds on the full path. My path to the images folder is the complete one on the server that I copied from the Security_health_check.log.

Sorry, I don't, understand.

  1. What is absolute (full) address (browser) path to that one image?
  2. What is absolute (full) address (browser) path to folder of image?
  3. What is the address that you go to when you click on the link?
  4. What is the address, when you copy links destination?
  5. Where is this all located on your HDD? (full address please).

1 What is absolute (full) address (browser) path to that one image?
2 What is absolute (full) address (browser) path to folder of image?
3 What is the address that you go to when you click on the link?
4 What is the address, when you copy links destination?
5 Where is this all located on your HDD? (full address please).

  1. www.mywebsite/images/index.php
  2. www.mywebsite/images
  3. www.mywebsite/home/linweb38/f/mywebsite-1234../htdocs/images/photo.jpg
  4. same as 3 above
    5 the jpg is on my website's server in the images folder (directory)

    I thought that the path to my images folder would be /htdocs/images/ but couldn't get it to work. It was only when I added the full path that the link for the photo was displayed on my browser window. So your code finds the jpg file and displays a link for it, but the link doesn't work yet.

Hmmmm...

$fileSelf = pathinfo(__FILE__);
$folderRoot = $fileSelf["dirname"]

$images = glob($folderRoot . "*.jpg");

foreach($images as $linkto) {
    $imageSelf = pathinfo($linkto);
    $suffixToAdd = $imageSelf["filename"] . $imageSelf["extension"];
    echo "<a href=" . $folderRoot . $suffixToAdd . ">" . $suffixToAdd . "</a><br />";
}

Could this work? If not, could you repeat those 5 questions again in this case?

Thanks Aeonix which are place holders that I need to add actual folder names to. Just to clarify this index file only has your code in PHP tags.

which are place holders that I need to add actual folder names to.

I don't understand, sorry. May you please explain?

I have replaced "dirname" with "images" that being my folder name for the images. Is that correct and do I need to alter anything else?

This script was actually ready-thing, you hadn't replace anything.

Could this work? If not, could you repeat those 5 questions again in this case?

I meant, run this script, look if it works for thine purposes. If it doesn't, I requested you repeating these 5 researches:

What is absolute (full) address (browser) path to that one image?
What is absolute (full) address (browser) path to folder of image?
What is the address that you go to when you click on the link?
What is the address, when you copy links destination?
Where is this all located on your HDD? (full address please).

The last script I provided, was a ready thing, nothing had to be changed.

I have amended the script to what you posted. Nothing is displayed, blank browser window. Address in browser mywebsite/images/

Oops, made a typo, sorry, try this one:

$fileSelf = pathinfo(__FILE__);
$folderRoot = $fileSelf["dirname"];
$images = glob($folderRoot . "*.jpg");
foreach($images as $linkto) {
    $imageSelf = pathinfo($linkto);
    $suffixToAdd = $imageSelf["filename"] . $imageSelf["extension"];
    echo "<a href=" . $folderRoot . $suffixToAdd . ">" . $suffixToAdd . "</a><br />";
}

Okay, this is my final answer, if this can't solve your issue, I can't really help you:

  1. First off, be entirely sure, your Linux installation allows both your folder AND your image, a public access.
  2. Second of all, update your script to this:

    <?php

    $images = glob("*.png");
    $folderRoot = "http://" . $_SERVER["HTTP_HOST"] . dirname($_SERVER["PHP_SELF"]);
    
    foreach($images as $imageName) {
        $imageUrl = $folderRoot . "/" . $imageName;
        echo "<a href=" . $imageUrl . ">" . $imageName . "</a><br />";
    }
    

    ?>

  3. Make sure this script lands amongst images.

Thanks very much Aeonix but I was getting a Forbidden using the last two scripts. You don't have permission to access /images/ on this server.

Update:

I have checked the permissions for the directory and the file and set them to
Directory for the images 777, index.php 766, and 766 for the file. The script is working now.

Thanks very much for this help :)

Glad to be helpful :)

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.