我有一个包含多个页面的 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 的解决方案更容易理解。