Перезапись URL: запретить полную перезапись существующего ресурса

Файл .htaccess ниже в моем корневом каталоге служит для перезаписи всех /api/, а затем выводит пары ключ-значение из URL-адреса из $_GET внутри /api/api.php?

Как мне изменить это, чтобы все существующие файлы или папки внутри API (такие как /api/test или /api/test/file.php, доступ к которым осуществляется через эту схему, не перезаписывались с помощью правила перезаписи?

<IfModule mod_rewrite.c> 
    Options +FollowSymlinks
    RewriteEngine On
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    #RewriteRule (.*) $1
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [QSA,L]
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^([^/]+)/ $1/$1.php?%1 [L]
</IfModule>
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
45
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать директиву RewriteCond, чтобы исключить ваши файлы и папки.

RewriteEngine On
#if not a file
RewriteCond %{REQUEST_FILENAME} !-f
#not a directory
RewriteCond %{REQUEST_FILENAME} !-d
#rewrite the /api request
RewriteCond %{REQUEST_URI} ^/api
RewriteCond %{QUERY_STRING} ^(.*)$
RewriteRule ^([^/]+)/ $1/$1.php?%1 [L]

Спасибо, starkeen, следует ли !-f читать !-d для второго условия перезаписи?

Vahe Jabagchourian 08.04.2019 03:03
Ответ принят как подходящий

Я создал следующий файл .htaccess, чтобы включить индекс каталога и резервный ресурс, и поместил его в корневой каталог, чтобы перехватывать каждый запрос из корня.

Также я установил параметр rewritebase /api и InheritDown, чтобы ограничить применение этих правил, а также рекурсивно распространить их на уже существующие каталоги, чтобы они (и вложенные файлы) не включались в процесс перезаписи по запросу.

Это дало успешный результат на $_GET, где в строке запроса было равное количество пар lhs (ключ) = rhs (значение) при условии, что они были введены как /api/lhs/rhs/lhs/rhs в запросе.

 <IfModule mod_rewrite.c> 
    Options +FollowSymlinks
    RewriteEngine On
    DirectoryIndex api.php
    FallbackResource index.php
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_URI} ^/api
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^(.*/)([^/]+)/([^/]+) $1?$2=$3&%1 [QSA,L]
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{QUERY_STRING} ^(.*)$
    RewriteRule ^([^/]+)/ $1/$1.php?%1 [L]
</IfModule>

RewriteBase /api
RewriteOptions InheritDown

Другие вопросы по теме