Файл .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>
Вы можете использовать директиву 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]
Я создал следующий файл .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
Спасибо, starkeen, следует ли !-f читать !-d для второго условия перезаписи?