Search code examples
.htaccess

.htaccess need help to serve requests to index.php in non root folder


I have a specific website structure:

root:

styles.css
pages/index.html
folder_with_assets_1
folder_with_assets_2
folder_with_images

I've renamed index.html to index.php in order to get rid of .html extension in the URL

But the problem is that index.php is located not in a root folder, it's in pages folder. Which right .htaccess rules could solve the problem in order to redirect requests to pages folder?

UPDATE the screenshot with folder structure: enter image description here

enter image description here


Solution

  • On the face of it, this just looks a standard front-controller pattern. Whether the front-controller is located inside a subdirectory or directly in the document root is largely irrelevant - the process is the same.

    Assuming you are using the .htaccess file in the document root and there is no discernable pattern to the page URLs...

    For example, using mod_dir FallbackResource:

    FallbackResource /pages/index.php
    

    Or, using mod_rewrite:

    DirectoryIndex /pages/index.php
    
    RewriteEngine On
    
    RewriteRule (^|/)index\.php - [L]
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . pages/index.php [L]
    

    UPDATE#1:

    It's "onepage" website format with plenty of JS and CSS. There are only local URLs pointing to sections (href tag) and AJAX call to specific PHP files

    In that case, it just looks like you need to change the DirectoryIndex - you don't need a front-controller pattern (as discussed above) at all.

    For example:

    DirectoryIndex /pages/index.php
    

    Now, a request for the "homepage", ie the document root https://example.com/ will serve /pages/index.php.


    UPDATE#2:

    From your screenshot, it looks like directory listings (mod_autoindex) are enabled. These should be disabled at the top of the .htaccess file:

    Options -Indexes
    

    UPDATE#3:

    From your screenshot, it would seem that what you have called "root" in your file structure is not actually your website's "document root", since you are accessing this location via a /test subdirectory, ie. localhost/test/. The directives above are assuming these files are located in the "document root", ie. localhost/ and there is no /test subdirectory. (Which I expect is how it is structured on your "live" environment?)

    If your .htaccess file is located in the /test subdirectory and you are requesting localhost/test/ (as per your screenshot) then you will need to adjust this accordingly:

    For example:

    DirectoryIndex /test/pages/index.php
    

    However, that will not work on the live site (assuming you don't have a /test subdirectory on live). Instead, you can simply omit the slash prefix, to make it relative.

    For example:

    DirectoryIndex pages/index.php
    

    This should work OK in your case since you have a SPA (just a homepage URL).