Я пытаюсь настроить правила перезаписи с помощью .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) и на совершенно неправильную перезапись в первом случае.
Я не уверен, может ли клиент обрабатывать перенаправления. Вот почему я пытаюсь выполнить внутреннюю перезапись.
Что мне нужно сделать, чтобы эта перезапись заработала?
Я получаю перенаправление 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, поскольку вы можете получить неожиданные результаты (одна не обязательно отменяет другую).