Переписать вместо перенаправления с помощью веб-приложения Azure / Linux

Я пытаюсь настроить правила перезаписи с помощью .htaccess на Веб-приложение Azure с Linux + Apache (+ PHP), однако я могу заставить работать только перенаправления (но без перезаписи).

Источник структурирован следующим образом:

./.htaccess
./updates/
./updates/.htaccess
./updates/check/
./updates/check/api.php
./updates/certificates/
./updates/certificates/api.php
./... # other files - must not be downloadable

My ./. Htaccess :

order deny,allow
deny from all
RewriteEngine on
RewriteRule "^updates/([A-Za-z]+)" "/updates/$1/api.php" [L,QSA]

РЕДАКТИРОВАТЬ: Проблема также сохраняется с

RewriteRule "^updates/([A-Za-z]+)$" "/updates/$1/api.php" [L,QSA]

My ./ updates / .htaccess :

order allow,deny
allow from all

Что мне нужно, это внутренняя перезапись, которая переписывает / updates / check? Foo = bar в /updates/check/api.php?foo=bar и / updates / Certific? A = b & c = d - /updates/certificates/api.php?a=b&c=d .

Я получаю перенаправление HTTP 301 на http: // $ server / updates / check /? Foo = bar . Когда я добавляю R = 301 (или R = 302 ) к флагам правил, я получаю перенаправление 301 (или 302) на http: // $ server / updates /check/api.php?foo=bar. Обратите внимание на http в обоих случаях (я делаю запрос на https с помощью curl) и на совершенно неправильную перезапись в первом случае.

Я не уверен, может ли клиент обрабатывать перенаправления. Вот почему я пытаюсь выполнить внутреннюю перезапись.

Что мне нужно сделать, чтобы эта перезапись заработала?

1
задан 19 March 2021 в 14:54
1 ответ

Я получаю перенаправление HTTP 301 на http: // $ server / updates / check /? foo = bar

Да, потому что check - это физический подкаталог, поэтому mod_dir (по умолчанию) «исправит» URL, добавив в конце косую черту URL-путь через внешний редирект 301. Это необходимо для того, чтобы mod_dir мог обслуживать DirectoryIndex (если он у вас есть).

Если бы вы изменили URL-адреса, добавив в них косую черту в конце, у вас не было бы этой проблемы.

Вы можете избежать этого перенаправления, отключив DirectorySlash . Если вы сделаете это, вы должны убедиться, что индексы каталогов (mod_autoindex) отключены, чтобы предотвратить случайное раскрытие вашей файловой системы.

Например, в верхней части корневого файла .htaccess :

Options -Indexes
DirectorySlash Off

Это также означает, что любые другие каталоги не будут доступны напрямую без добавления вручную завершающей косой черты с внутренней перезаписью ( или внешнее перенаправление), хотя это может или не может быть проблемой для вас.

Ссылка:


ОБНОВЛЕНИЕ: Из-за этого «ограничения» я был бы склонен изменить структура файла (или URL-адреса), чтобы избежать таких конфликтов, а не отключать DirectorySlash .

Например:

/updates/check-api.php
/updates/certificates-api.php

И перепишите соответственно:

RewriteRule ^updates/([A-Za-z]+)$ /updates/$1-api.php [L]

В сторону:

 запретить, разрешить 
запретить от всех 
 

Обратите внимание, что это Apache 2.2 и ранее не рекомендуются в Apache 2.4. Вместо этого вы должны использовать Требовать все отклонено и Требовать все разрешено . Однако вам следует избегать смешивания как старых, так и новых директив auth, поскольку вы можете получить неожиданные результаты (одна не обязательно отменяет другую).

0
ответ дан 24 April 2021 в 01:02

Теги

Похожие вопросы