Открыть статичный файл с помощью .htaccess

12
Gerga
На сайте с 02.08.2015
Offline
94
925

Есть статичные файлы вида "index.php?categoryID=12". Как в .htaccess сделать так, чтобы при обращении к "site.ru/index.php?categoryID=12" открывался файл "index.php?categoryID=12"?

Я реализовал подобную вещь на PHP:


<?php
/**
* Скрипт подгрузки файла по GET-параметрам
* @version 1.0.1
**/

// проверка на необходимость
if (!$_SERVER['QUERY_STRING']) {
return;
}

// путь к статичному файлу
$fileName = join('?', [ $_SERVER['SCRIPT_FILENAME'],
$_SERVER['QUERY_STRING'],
]);

// проверка на сущ. файла и его вывод
if (file_exists($fileName)) {
echo file_get_contents($fileName);
exit;
}

Как такое сделать в .htaccess? Пока он таким получается:


<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME}?%{QUERY_STRING} -f
#RewriteRule ^ что тут можно прописать? [L]
</IfModule>
ArbNet
На сайте с 27.10.2019
Offline
77
#1
Gerga:
Есть статичные файлы вида "index.php?categoryID=12"

Как понять? Какое имя файла на диске?

Блажен, кто не стремится сделать лучше: он не рискует быть не понятым.
fliger
На сайте с 17.09.2015
Offline
75
#2
Gerga:
Есть статичные файлы вида "index.php?categoryID=12"

Это ОДИН файл index.php, который динамически создает страницы вида /?categoryID=12. Отображаемая на них информация загружается, например, из каких-то файлов, физически имеющихся на сервере, по categoryID:


if (!empty($_SERVER['QUERY_STRING']) && preg_match('/^categoryID=\d+$/', $_SERVER['QUERY_STRING'])) {
$file = $_SERVER['DOCUMENT_ROOT'].'/КАКОЙ_ТО_ПУТЬ/.$_GET['categoryID'].'.txt';
if (is_readable($file)) {
// Данные из текстового файла выводятся на странице /?categoryID=12, которая физически не существует на сервере
echo @file_get_contents($file);
}
}

Как-то так, а иначе в вашем вопросе - белиберда.

IL
На сайте с 20.04.2007
Offline
418
#3
fliger:
Это ОДИН файл index.php, который динамически создает страницы вида

Всё же, видимо, у Gerga есть именно статичные файлы и именно с таким именем.. =)

Gerga:
if (file_exists($fileName)) {

... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
Gerga
На сайте с 02.08.2015
Offline
94
#4
ArbNet:
Как понять? Какое имя файла на диске?

именно "index.php?categoryID=12".

ivan-lev, да.

J
На сайте с 20.02.2014
Offline
97
jkm
#5


RewriteCond %{QUERY_STRING} ^(categoryID=\d+)$
RewriteRule ^(index\.php)$ /$1\%3F%1? [L]

Или

RewriteCond %{REQUEST_FILENAME}?%{QUERY_STRING} -f

RewriteRule (.+) /$1\%3F%{QUERY_STRING}? [L]
ArbNet
На сайте с 27.10.2019
Offline
77
#6
Gerga:
именно "index.php?categoryID=12".
ivan-lev, да.

Что именно, да? Физически на диске какие у вас файлы?

Если надо отдавать именно файлы по имени это одно, а если как заметил fliger, index.php генерирует по переменной это уже другое.

Gerga
На сайте с 02.08.2015
Offline
94
#7

jkm, спасибо! То, что нужно.

---------- Добавлено 29.02.2020 в 11:09 ----------

jkm:

RewriteCond %{REQUEST_FILENAME}?%{QUERY_STRING} -f
RewriteRule (.+) /$1\%3F%{QUERY_STRING}? [L]

Что тут "/$1\%3F%{QUERY_STRING}?" происходит?

---------- Добавлено 29.02.2020 в 11:22 ----------

Я понял. "%3F" - это код вопросительного знака. Не используется знак "?", чтобы не было воспринято как передача GET-параметров в исполняемый php файл?

А когда происходит замена "%3F" на вопросительный знак?

J
На сайте с 20.02.2014
Offline
97
jkm
#8
Gerga:
Я понял. "%3F" - это код вопросительного знака. Не используется знак "?", чтобы не было воспринято как передача GET-параметров в исполняемый php файл?

А когда происходит замена "%3F" на вопросительный знак?

Всё верно "%3F" это код вопросительного знака.

В RewriteRule c шаблоном сопоставляется строка уже в нормализованном виде, т.е после преобразования относительных элементов пути ".", ".." и декодирования текста, заданного в виде %XX.

Флаг [L] останавливает текущую итерацию обработки запроса, а mod_rewrite запускает обработку запроса снова и снова, до тех пор, пока он не перестанет меняться.

Перед началом очередной итерации обработки запроса снова происходит преобразование "." ".." и декодирование %XX.

https://habr.com/en/company/sprinthost/blog/129560/

SocFishing
На сайте с 26.09.2013
Offline
118
#9

Не понимаю зачем вы используете $_SERVER['SCRIPT_FILENAME'], я так понимаю, что вам нужен текущий каталог и загрузка файла имя которого есть в QUERY_STRING 🙄

Так вот пример,

$file = __DIR__.'/'.$_SERVER['QUERY_STRING'];

// проверка на сущ. файла и его вывод

if (file_exists($file)) {

echo file_get_contents($file);

exit;

}

Ну и для удобства, можно сразу исполнять, например вложенность 4 🤣

https://test.ru/test.php?../../../../etc/passwd

По сабжу. Мб

RewriteRule ^index.php?categoryID=(.*)$ file.php?id=$1

<?php

//file.php

echo file_get_contents('/var/www/site/files/index.php?categoryID='.(int)$_GET['id']);

?>

Слишком мудреная тема использовать названия файла .php с параметрами, так как расширения вебсервер хватает как php. В данной ситуации проще всего конвертнуть все файлы в нормальный вид и использовать.

★Сервис идентифицирует (https://socfishing.com/?utm_source=searchengines) посетителей вашего сайта и предоставляет их профили ВКонтакте, Телефон, Почта! Цены копеечные, работаем 8 лет.
Gerga
На сайте с 02.08.2015
Offline
94
#10
SocFishing:
Не понимаю зачем вы используете $_SERVER['SCRIPT_FILENAME']
SocFishing:
Так вот пример,

$file = __DIR__.'/'.$_SERVER['QUERY_STRING'];

Получится "папка/categoryID=12" - это не подходит. Плюс используя "__DIR__" вы делаете такую возможность:

Со "SCRIPT_FILENAME" такое не пройдет.

---------- Добавлено 29.02.2020 в 13:12 ----------

SocFishing:
Слишком мудреная тема использовать названия файла .php с параметрами, так как расширения вебсервер хватает как php. В данной ситуации проще всего конвертнуть все файлы в нормальный вид и использовать.

2 RewriteCond и 1 RewriteRule и все отлично. Спасибо, jkm!

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий