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

Time:01-05

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

CodePudding user response:

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).

  •  Tags:  
  • Related