我已经阅读了几个小时的文章,但是由于没有控制台输出来调试 htaccess 文件,我完全感到沮丧。
丑陋的文件夹结构:
/html/api/v2/estimates/index.php?status=completed
/html/api/v2/estimate/index.php?id=1001
/html/api/v2/proposals/index.php?status=accepted
/html/api/v2/proposal/index.php?id=1001
/html/api/v2/contracts/index.php?status=signed
/html/api/v2/contract/index.php?id=1001
/html/api/v2/invoices/index.php?status=sent
/html/api/v2/invoice/index.php?id=1001
所需的文件夹结构:
/html/api/v2/estimates/completed
/html/api/v2/estimate/1001
/html/api/v2/proposals/accepted
/html/api/v2/proposal/1001
/html/api/v2/contracts/signed
/html/api/v2/contract/1001
/html/api/v2/invoices/sent
/html/api/v2/invoice/1001
我的数字 .htaccess 仅在我将它们放在目录估计、提案、合同和发票中时才有效。
例子:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(\d+)/?$ index.php?id=$1
</IfModule>
我的字符串 .htaccess 仅在我将它们放在目录估计、建议、合同和发票中时才有效。
例子:
<IfModule mod_rewrite.c>
Options +FollowSymLinks
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(\w+)/?$ index.php?status=$1
</IfModule>
如果我要将htaccess 文件放在/v2
文件夹中,我需要在上面的这些脚本中修改什么?
请尝试在
/v2/.htaccess
文件中执行以下操作:“数字”规则必须在“字符串”规则之前以避免冲突。否则,每次使用当前正则表达式时, “字符串”规则都会获胜。
(\w+)
每个规则中的第一个子模式捕获子目录(estimate
、、estimates
等)。您似乎不需要按名称显式检查子目录,除非存在潜在冲突。例如。/estimates/1234
自然会被第一条规则捕获,而不是第二条,这可能是意图 - 但这取决于是否/estimates/1234
是一个有效的 URL。(这也许可以通过简单地检查s
目录名称的结尾来解决?)请注意,匹配
\w
、a-z
和(下划线)。如果子目录和/或“字符串”只是字母(甚至只是小写字母),那么应该使模式更具限制性。如果是这种情况,那么规则的顺序就无关紧要了,因为它会消除冲突。A-Z
0-9
_
您似乎不需要(相对昂贵的)文件系统检查,因为“限制性”正则表达式不应该与真实文件匹配(除非您在文件系统上有没有文件扩展名的文件?我不太可能会思考。)。
<IfModule>
不需要包装器,因为这些规则对于您的站点运行是强制性的。更新:请注意,我还删除了目录检查。如果您确实有表单
/estimates/<subdir>
等的其他子目录,那么这些指令可能会匹配,从而使目录无法访问(它被路由到您的脚本,我希望这会触发 404)。但是,您通常不希望用户自己直接访问目录 - 通常他们会返回 403。这些目录中的文件仍然可以访问,所以我认为这不太可能成为问题。