У меня есть веб-приложение с несколькими страницами. Файл .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]