.htaccess RewriteRule поведение с существующими подкаталогами - PullRequest
0 голосов
/ 02 апреля 2019

У меня было много похожих вопросов, но я не смог найти этот конкретный случай:

Имея такую ​​структуру:

public_html/
   q/
      .htaccess
      index.php
      /dirnofixedname1
      /dirnofixedname2
      /dirnofixedname3
  • dirnofixednameN - это папки с файламидолжен использоваться index.php и не быть напрямую доступным (называется так, поскольку я не могу перечислить все в файле .htaccess или это будет нецелесообразно)
  • index.php должен обрабатывать входящие запросы

Намерение состоит в том, чтобы обрабатывать запросы, такие как: http://domain/q/dirnofixedname2 с http://domain/q/index.php?q=dirnofixedname2, пока отображается http://domain/q/dirnofixedname2.Действительно популярный и уже раскрытый случай.

Так что файл .htaccess:

RewriteEngine On

RewriteCond $1 !^(index\.php)
RewriteRule ^(.*)$ index.php?q=$1 [L]

Проблема возникает в том, что когда запрос соответствует этим существующим каталогам (что я хочу), он работает какпредназначен (index.php выполняется и получает q), но делает перенаправление на:

http://domain/q/dirnofixedname2/?q=dirnofixedname2

(и показывает это в строке URL) вместо предназначенного:

http://domain/q/dirnofixedname2

В частности, если каталог не существует,

http://domain/q/dirthatdoesnotexist

Правильно обрабатывается index.php с q как dirthatdoesnotexist (скрипт явно отклоняет это и ничего не возвращает).

Есть ли у вас какие-либо идеи о том, как избежать этого перенаправления в тех случаях, когда существует подкаталог?(Практически иметь то же имя dir, что и у параметра)

1 Ответ

0 голосов
/ 15 апреля 2019

Это происходит из-за директивы DirectorySlash, которая по умолчанию находится в состоянии On, поскольку вы запрашиваете фактический каталог в вашем URI.

Вы можете отключить его, используя:

DirectorySlash Off

Также для маскировки списка каталогов используйте:

Options -Indexes

в верхней части вашего .htaccess

...