Можно ли htaccess искать определенный файл, связанный с URL-адресом, и вернуться на один шаг, если не найден?
Пример:
/ Пример / здесь / где / с
Htaccess выглядит, если «/ example / here / where / from» действительно является файлом какого-либо типа (/example/here/where/from.php), если это не удается, он возвращается на один шаг и проверяет, есть ли '/ example / here / где '- файл (/example/here/where.php) и т. д.
Если он должен был вернуться в дерево, предположите их как параметры, как в:
/example/here.php
$ _GET ['params'] = 'где / from';
заранее спасибо
Редактировать:
написание
Это очень сложно, но вот код, который рекурсивно пересекает родительский каталог данного REQUEST_URI и поддерживает бесконечную глубину.
Включите mod_rewrite и .htaccess через httpd.conf
а затем поместите этот код в свой .htaccess
в каталоге DOCUMENT_ROOT
:
# Turn mod_rewrite on RewriteEngine On RewriteBase / # If the request is for a valid file RewriteCond %{REQUEST_FILENAME} -f [OR] # If the request is for a valid link RewriteCond %{REQUEST_FILENAME} -l # don't do anything RewriteRule ^ - [L] # if current ${REQUEST_URI}.php is not a file then # forward to the parent directory of current REQUEST_URI RewriteCond %{DOCUMENT_ROOT}/$1/$2.php !-f RewriteRule ^(.*?)/([^/]+)/?$ $1/ [L] # if current ${REQUEST_URI}.php is a valid file then # load it be removing optional trailing slash RewriteCond %{DOCUMENT_ROOT}/$1.php -f RewriteRule ^(.*?)/?$ $1.php [L]
Предположим, что исходный URI: /index/foo/bar/baz
. Также предположим, что %{DOCUMENT_ROOT}/index.php
существует, но никакие другие php-файлы не существуют в DOCUMENT_ROOT
.
RewriteRule # 1 имеет регулярное выражение, которое прерывает текущий REQUEST_URI на 2 части:
$1
который будет index/foo/bar
здесь $2
который будет baz
здесь RewriteCond проверяет, является ли %{DOCUMENT_ROOT}/$1/$2.php
(что означает, что %{DOCUMENT_ROOT}/index/foo/bar/baz.php
) НЕ является допустимым файлом.
Если условие выполнено успешно, оно внутренне перенаправлено на $1/
которое является index/foo/bar/
здесь.
Логика RewriteRule # 1 повторяется снова, чтобы REQUEST_URI как (после каждой рекурсии):
index/foo/bar/
index/foo/
index/
На данный момент RewriteCond не работает для правила №1, потому что существует ${DOCUMENT_ROOT}/index.php
.
Мой RewriteRule # 2 говорит о $1.php
на $1.php
если %{DOCUMENT_ROOT}/$1.php
является допустимым файлом. Обратите внимание, что RewriteRule # 2 имеет регулярное выражение, которое соответствует всем, кроме последнего косая черта, и помещает его в $1
. Это означает, что %{DOCUMENT_ROOT}/index.php
является допустимым файлом (и это действительно так).
На этом этапе обработка mod_rewrite завершена, поскольку никакое дальнейшее правило не может быть запущено, так как после этого RewriteCond завершается с ошибкой, поэтому %{DOCUMENT_ROOT}/index.php
должным образом обслуживается вашим веб-сервером Apache.