Как получить доступ к index.php каталога без завершающей косой черты И не получить перенаправление 301
У меня есть эта структура: site.com/api/index.php
, Когда я отправляю данные site.com/api/
нет проблем, но я думаю, что было бы лучше, если бы API работал без завершающей косой черты, например так: site.com/api
, Это вызывает перенаправление 301 и, таким образом, теряет данные (так как данные не пересылаются). Я пробовал каждую переписку, которую только мог придумать, и не мог избежать перенаправления. Это мое текущее правило переписывания (хотя оно может быть неактуальным).
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/(.*)$ api/index.php [L]
Могу ли я заставить этот URL работать и поддерживать данные поста, не используя косую черту?
Некоторые переписывает, что не работает: (все еще перенаправить)
RewriteRule ^api$ api/index.php [L]
RewriteRule ^api/*$ api/index.php [L]
2 ответа
Сначала нужно отключить косую черту каталога, но есть причина, по которой очень важно наличие косой черты:
Отключение перенаправления косой черты может привести к раскрытию информации. Рассмотрим ситуацию, когда активен mod_autoindex
(Options +Indexes)
а такжеDirectoryIndex
установлен на допустимый ресурс (скажем,index.html
) и нет другого специального обработчика, определенного для этого URL. В этом случае запрос с косой чертой будет показыватьindex.html
файл.Но запрос без завершающего слеша будет содержать список содержимого каталога.
Это означает, что доступ к каталогу без завершающего слеша будет просто перечислять содержимое каталога, а не обслуживать индекс по умолчанию (например, index.php
). Поэтому, если вы хотите отключить косую черту каталога, вы должны убедиться, что внутренняя перезаписывающая косая черта перезаписана обратно.
DirectorySlash Off
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^(.*[^/])$ /$1/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^api/(.*)$ api/index.php [L]
Первое правило гарантирует, что завершающий слеш будет добавлен в конец, хотя только внутри. В отличие от mod_dir, который перенаправляет браузер извне, внутренняя перезапись невидима для браузера. Следующее правило затем выполняет маршрутизацию API, и из-за первого правила гарантируется наличие косой черты.
Если вы не хотите использовать решение, предоставленное Jon Lin (реконфигурирование всех ваших URL-адресов, указывающих на каталоги), вы можете использовать следующий код (обратите внимание на? В регулярном выражении - он в основном говорит, что косая черта после "api" является необязательной). Я не проверял это, но он должен работать как есть:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/?(.*)$ api/index.php [L]