Неожиданно сам для себя, среди кучи неработающих решений (мой мозг так и не смог осилить в короткие сроки тот волшебный механизм, по которому работает mod_rewrite), я, кажется, нашел наконец решение, которое перенаправит ВСЕ запросы на index.php вне зависимости от того, существует файл, или не существует. И, вдобавок, без жесткого прописывания пути к index.php или названия домена. Автор этого решения добавил также возможность исключать некоторые запросы из перенаправления, так что, если это всё действительно правда и впоследствии не найдется никакой ошибки в работе данных директив, то я буду еще долго писать кипятком.

UPD: Изначальный код оказался неидеальным. Приходится добавить директиву DirectorySlash Off, иначе, если вы захотите убрать trailing slash с URL который попадает на реально существующую директорию, apache будет перенаправлять вас на http://site.com/directory/, а вы его обратно на http://site.com/directory и перенаправление попадёт в цикл, который никогда не завершится.

# Turn rewriting on
Options +FollowSymLinks
DirectorySlash Off
RewriteEngine On
# Redirect requests to index.php
RewriteCond %{REQUEST_URI} !=/index.php
RewriteCond %{REQUEST_URI} !.*\.png$ [NC]
RewriteCond %{REQUEST_URI} !.*\.jpg$ [NC]
RewriteCond %{REQUEST_URI} !.*\.css$ [NC]
RewriteCond %{REQUEST_URI} !.*\.gif$ [NC]
RewriteCond %{REQUEST_URI} !.*\.js$ [NC]
RewriteRule .* /index.php

Ссылка на оригинал: .htaccess redirect all requests to index.php

Оригинал полностью, на случай, если статья с оригинального сайта внезапно проебётся, как это уже не раз бывало со сслыками в сети Интернет.

htaccess Redirect All Requests to Index.php Script

So for one of my website projects I wanted to create a very basic content management system (of sorts). The plan was to have a header and footer template class, and include these from the ‘index.php’. The bit between the header and footer (‘content’) would then be pulled from another file, depending on the URL.

The basic set-up for this kind of CMS is that all requests are sent to one script, which handles working out which files need to be included based on the request URL. If we’re using Apache as our web server, we can do this easily enough using the .htaccess file.

A htaccess file (also known as a distributed configuration file) allows you to configure your web-server on a per-directory basis. One of the handy features of the htaccess file is that we can invoke server-side modules. We can use the mod_rewrite module to redirect or rewrite certain URL requests.

So to set-up our CMS, we need to rewrite all requests to any file on the server to ‘/index.php’. A first attempt at this might be:

    # Turn rewriting on
    Options +FollowSymLinks
    RewriteEngine On
    # Redirect requests to index.php
    RewriteRule .* /index.php

This looks OK, until you think about what will actually happen. We’re redirecting ALL requests to ‘index.php’ – including requests to ‘index.php’… They call this infinite loopage in the biz’. Our next (and much better attempt) would be:

    # Turn rewriting on
    Options +FollowSymLinks
    RewriteEngine On
    # Redirect requests to index.php
    RewriteCond %{REQUEST_URI} !=/index.php
    RewriteRule .* /index.php

This will work well – unless you have things like images, stylesheets, JavaScript or generally any other files we’ve come to expect in a rich internet experience. We can fix this by also excluding requests to these filetypes from the rewrite:

    # Turn rewriting on
    Options +FollowSymLinks
    RewriteEngine On
    # Redirect requests to index.php
    RewriteCond %{REQUEST_URI} !=/index.php
    RewriteCond %{REQUEST_URI} !.*\.png$ [NC]
    RewriteCond %{REQUEST_URI} !.*\.jpg$ [NC]
    RewriteCond %{REQUEST_URI} !.*\.css$ [NC]
    RewriteCond %{REQUEST_URI} !.*\.gif$ [NC]
    RewriteCond %{REQUEST_URI} !.*\.js$ [NC]
    RewriteRule .* /index.php

And there you have it! A (useful) .htaccess file used to redirect all requests to the index.php file! Now for that CMS…

This entry was posted on Sunday, March 14th, 2010 at 6:18 pmand is filed under PHP.