Секундная путаница перезаписи

#mod-rewrite #apache2

#переписать мод #apache2

Вопрос:

У меня есть следующие настройки перезаписи:

 RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule ^api/?.*$ api.php [NC,L]

RewriteCond %{REQUEST_URI} !-f
RewriteCond %{REQUEST_URI} !-d
RewriteRule ^.*$ web.php [L]
  

Я хочу, чтобы не файлы и каталоги были обнаружены api.php или web.php (которые выполняют собственную маршрутизацию), а остальные возвращают файл или каталог. Однако основной маршрут, '/' который mod_rewrite видит как '' , не перехватывается — я думаю, это потому, что / является корневым каталогом.

Как я могу исправить это, чтобы оно проходило в web.php сохраняя при этом доступ к каталогам?

Ответ №1:

Во-первых, вы захотите изменить REQUEST_URI в своих правилах на REQUEST_FILENAME. Смотрите http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

REQUEST_URI: ресурс, запрошенный в строке HTTP-запроса.

REQUEST_FILENAME: полный путь локальной файловой системы к файлу или скрипту, соответствующему запросу.

Затем добавьте другое правило:

 RewriteCond %{REQUEST_URI} /
RewriteRule .* web.php [L]
  

Таким образом, конечный результат был бы:

 RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^api/?.*$ api.php [NC,L]

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule (.*)? web.php [NC,L]

RewriteCond %{REQUEST_URI} /
RewriteRule .* web.php [L]
  

Ответ №2:

Синтаксис: URL-путь к базе данных для перезаписи

URL-путь может быть корневым относительным путем или пустым. Пустое значение URL-пути означает, что база правил будет равна корню веб-сайта.