为什么这个.htaccess 文件不能正确重定向?

为什么这个.htaccess 文件不能正确重定向?

我有一个包含多个页面的 Web 应用程序。.htaccess 文件将 domain-name.com/ 之后的所有内容重定向到我的 index.php 文件,该文件处理输入并呈现相应的页面。

但是,我在 domain-name.com/ 下还有一些实际目录需要从重定向中排除。例如,我的 PHPMyAdmin 目录 (/pma)。

一切都运行正常,直到我添加了一行将 reports/[name] 重定向到索引页。现在,我的 /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

答案1

此类例外情况更容易作为最终规则应用,无需进行任何重写。将您的RewriteCond行替换为:

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

答案2

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]

但是,这有点晦涩难懂。如果您要制定几条有例外的规则,那么我认为 David 的解决方案更容易理解。

相关内容