Назад | Перейти на главную страницу

Почему этот файл .htaccess не перенаправляет правильно?

У меня есть веб-приложение с несколькими страницами. Файл .htaccess перенаправляет все, что находится после имени домена.com/, в мой файл index.php, который обрабатывает ввод и отображает соответствующую страницу.

Однако у меня также есть несколько фактических каталогов под domain-name.com/, которые необходимо исключить из перенаправления. Например, мой каталог PHPMyAdmin (/ pma).

Все работало нормально, пока я не добавил строку для перенаправления отчетов / [имя] также на страницу индекса. Теперь мой / pma не переходит в каталог PMA, а вместо этого переходит в index.php моего приложения.

Если я использую /pma/index.php, он работает, но не имеет смысла, почему / pma перестанет работать с этим одним новым правилом перезаписи.

Комментирование RewriteRule для отчетов заставляет все снова работать.

Я не могу понять почему. Спасибо за любую помощь!

Файл .htaccess:

RewriteEngine On

# Redirect http to https (http://htaccesscheatsheet.com/#force-https)
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}


# Ignore the following directories (don't remap to page engine)
RewriteCond %{REQUEST_URI} !^\/(pma*|css)

#Redirect all /reports/[report name] requests to index.php?page=reports/[report name]
RewriteRule ^reports/([a-z0-9\-_]+)\/{0,1}$ index.php?page=reports/$1   [NC,QSA,L]

#Redirect all /[pagename] requests to index.php?page=[pagename]&[querystring]
RewriteRule ^([a-z0-9\-_]+)\/{0,1}$ index.php?page=$1   [NC,QSA,L]


# Return .json files with the correct mime type (needed to support manifest.json)
AddType application/json .json

RewriteCond только применяется к следующему RewriteRule. Теперь у вас есть два правила, каждое из которых требует исключения.

Так что просто повтори это RewriteCond строка вроде этого:

#Redirect all /[pagename] requests (with exceptions) to index.php?page=[pagename]&[querystring]
RewriteCond %{REQUEST_URI} !^\/(pma*|css)
RewriteRule ^([a-z0-9\-_]+)\/{0,1}$ index.php?page=$1   [NC,QSA,L]

Альтернативный способ сделать это, если вам нравятся регулярные выражения PCRE, выглядит примерно так:

RewriteRule ^(?!pma|css)([a-z0-9\-_]+)\/{0,1}$ index.php?page=$1   [NC,QSA,L]

Однако это немного неясно. Если у вас будет несколько правил с исключениями, я бы согласился, что решение Дэвида легче читать.

Подобные исключения проще применять в качестве окончательных правил, которые не требуют переписывания. Замени свой RewriteCond линия с:

RewriteRule ^pma/ - [L]
RewriteRule ^css/ - [L]