Как получить доступ к 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_dir документы:

Отключение перенаправления косой черты может привести к раскрытию информации. Рассмотрим ситуацию, когда активен 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]
Другие вопросы по тегам