1

Тема: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

Мені потрібно, щоб при клієнтських запитах на отримання файлів (*.html, *.css, *.js) сервер перенаправляв запити до файлу *.php і щоб клієнт отримував результат виконання php-коду. Перенаправлення має відбуватися без додаткових клієнтських запитів, тобто [R=301] (Redirect) - не варіант.

В корені сайту є файл ".htaccess", в ньому є наступний код:

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteRule ^(.*)\.(html|css|js)$ /$2.php?file=$1.$2 [L,QSA]
</IfModule>

І якщо запитаний файл (*.html, *.css, *.js) не існує, то перенаправлення на *.php йде успішно і клієнт отримує результат виконання php-коду.
А якщо файл (*.html, *.css, *.js) існує, то перенаправлення не відбувається і клієнт отримує початковий файл (*.html, *.css, *.js) без змін.

Як мені зробити так, щоб перенаправлення відбувалося в будь-якому випадку, незалежно від того, існує файл, чи ні ?

2

Re: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

Телепатично припущу, що у вас на хостингу встановлено зв'язку nginx+apache, і віддає файли, що вже існують, саме ngnix.

Подякували: leofun011

3 Востаннє редагувалося leofun01 (20.10.2016 12:08:39)

Re: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

koala написав:

nginx+apache

Все правильно. А хто саме віддає файли, не знаю.
Чи можна дописати в .htaccess щось таке, що змусить сервер перенаправляти запити ?

4

Re: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

Ну, мені важко собі уявити, нащо ставити apache перед ngnix. Тобто запит потрапляє до ngnix, той швиденько обробляє його, наскільки виходить, а як не вийшло чи це php - смикає apache, який вже довго і важко перебирає всі модулі, всі налаштування з усіх .htaccess-ів і т.д. Відповідно, вам треба дивитися в налаштування ngnix.

Подякували: leofun011

5

Re: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

Тепер до мене дійшло. Можна створити папку, в якій буде статичний контент і коли клієнти будуть запитувати файли з кореню, то перенаправлення відбудеться успішно.
Зараз попробую і якщо получиться, то закину рішення сюди.

6 Востаннє редагувалося leofun01 (21.10.2016 16:06:02)

Re: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

<IfModule mod_rewrite.c>

    RewriteEngine On
    RewriteBase /

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)\.((a|j)sp|rb|p(y|l)|sh|cgi)$ /$1.php [QSA,N,L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)\.(x?)(htl?m?|th[ml]{0,2})$ /$1.$2html [QSA,N]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule \.(x?html|(cs|j)s)$ /$1.php [QSA,L]

    RewriteRule \.htaccess$ - [F]

</IfModule>

Ще питання. Як об'єднати умови
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
для всіх RewriteRule
    RewriteRule ^(.*)\.((a|j)sp|rb|p(y|l)|sh|cgi)$ /$1.php [QSA,N,L]
    RewriteRule ^(.*)\.(x?)(htl?m?|th[ml]{0,2})$ /$1.$2html [QSA,N]
    RewriteRule \.(x?html|(cs|j)s)$ /$1.php [QSA,L]
?

7

Re: .htaccess > RewriteRule > Перенаправлення при запиті існуючого файлу.

Забув сказати, що в php-файлах використовується конструкція

file_get_contents('directoryName'.$_SERVER['REQUEST_URI']);

Використовувати include в таких випадках не можна, бо якщо в файлі буде php-код, то від почне виконуватися.

І ще питання: Якщо читати файл повністю, яка з функцій
file_get_contents
file
readfile
fopen+fread
буде виконуватися швидше ?