Redirect all to index.php using htaccess

后端 未结 7 2068
情话喂你
情话喂你 2020-11-22 14:08

I\'m writing a simple PHP-based MVC-ish framework. I want this framework to be able to be installed in any directory.

My PHP script grabs the request uri and breaks

相关标签:
7条回答
  • 2020-11-22 14:24

    Silly answer but if you can't figure out why its not redirecting check that the following is enabled for the web folder ..

    AllowOverride All

    This will enable you to run htaccess which must be running! (there are alternatives but not on will cause problems https://httpd.apache.org/docs/2.4/mod/core.html#allowoverride)

    0 讨论(0)
  • 2020-11-22 14:27

    After doing the don't forget to change your anchor tag, home

    Example:

    .htacces file
    RewriteEngine On
    
    RewriteRule ^about/$ /about.php
    
    PHP file:
    <a href="about/"> about</a>
    
    
    0 讨论(0)
  • 2020-11-22 14:39

    just in case you were still wondering how to redirect all request either if the directory exists (for core framework folders and files) to the framework index handler, after some error/success attempts just noticed I just needed to change the RewriteCond in the .htaccess file

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    

    the above condition states "not found files" and "not found directories", ok, what if just remove "not found" (!-d) line, and ended with something like the below:

    RewriteEngine on
    RewriteBase /framework/
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /framework/index.php [L,QSA]
    

    It worked for me like a charm

    0 讨论(0)
  • 2020-11-22 14:44

    There is one "trick" for this problem that fits all scenarios, a so obvious solution that you will have to try it to believe it actually works... :)

    Here it is...

    <IfModule mod_rewrite.c>
    
       RewriteEngine On
    
       RewriteCond %{REQUEST_FILENAME}  -f [OR]
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteRule ^(.*)$ index.php [L,QSA]
    
    </IfModule>
    

    Basically, you are asking MOD_REWRITE to forward to index.php the URI request always when a file exists AND always when the requested file doesn't exist!

    When investigating the source code of MOD-REWRITE to understand how it works I realized that all its checks always happen after the verification if the referenced file exists or not. Only then the RegEx are processed. Even when your URI points to a folder, Apache will enforce the check for the index files listed in its configuration file.

    Based on that simple discovery, turned obvious a simple file validation would be enough for all possible calls, as far as we double-tap the file presence check and route both results to the same end-point, covering 100% of the possibilities.

    IMPORTANT: Notice there is no "/" in index.php. By default, MOD_REWRITE will use the folder it is set as "base folder" for the forwarding. The beauty of it is that it doesn't necessarily need to be the "root folder" of the site, allowing this solution work for localhost/ and/or any subfolder you apply it.

    Ultimately, some other solutions I tested before (the ones that appeared to be working fine) broke the PHP ability to "require" a file via its relative path, which is a bummer. Be careful.

    Some people may say this is an inelegant solution. It may be, actually, but as far as tests, in several scenarios, several servers, several different Apache versions, etc., this solution worked 100% on all cases!

    0 讨论(0)
  • 2020-11-22 14:46

    You can use something like this:

    RewriteEngine on
    RewriteRule ^.+$ /index.php [L]
    

    This will redirect every query to the root directory's index.php. Note that it will also redirect queries for files that exist, such as images, javascript files or style sheets.

    0 讨论(0)
  • 2020-11-22 14:48

    To redirect everything that doesnt exist to index.php , you can also use the FallBackResource directive

    FallbackResource /index.php
    

    It works same as the ErrorDocument , when you request a non-existent path or file on the server, the directive silently forwords the request to index.php .

    If you want to redirect everything (including existant files or folders ) to index.php , you can use something like the following :

    RewriteEngine on
    
    RewriteRule ^((?!index\.php).+)$ /index.php [L]
    

    Note the pattern ^((?!index\.php).+)$ matches any uri except index.php we have excluded the destination path to prevent infinite looping error.

    0 讨论(0)
提交回复
热议问题