RewriteRule 在 root 下不起作用。仅在当前文件夹中

RewriteRule 在 root 下不起作用。仅在当前文件夹中

我已经阅读了几个小时的文章,但是由于没有控制台输出来调试 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文件夹中?

答案1

请尝试在文件中执行以下操作/v2/.htaccess

Options +FollowSymLinks
RewriteEngine On

RewriteRule ^(\w+)/(\d+)/?$ $1/index.php?id=$2 [L]
RewriteRule ^(\w+)/(\w+)/?$ $1/index.php?status=$2 [L]

“数字”规则必须是避免冲突。否则,“字符串”规则每次都使用当前的正则表达式。

每个规则中的第一个子(\w+)模式捕获子目录(estimateestimates等等)。除非存在潜在冲突,否则似乎不需要通过名称明确检查子目录。例如,/estimates/1234自然会被第一条规则捕获,而不是第二条规则,这可能是意图 - 但这取决于是否是有效的 URL。(这也许可以通过简单地检查目录名称的/estimates/1234尾随来解决这个问题?)s

请注意,\w匹配a-zA-Z0-9_下划线)。如果子目录和/或“字符串”仅由字母(甚至只是小写字母)组成,则应使模式更加严格。如果是这种情况,则规则的顺序无关紧要,因为它会消除冲突。

您似乎不需要(相对昂贵的)文件系统检查,因为“限制性”正则表达式不应与真实文件匹配(除非文件系统上没有文件扩展名的文件?我认为不太可能)。

包装器<IfModule>不是必需的,因为这些规则对于您的网站运行是必需的。

更新:请注意,我还删除了目录检查。如果您确实有其他形式为/estimates/<subdir>等的子目录,那么这些指令可能会匹配,导致目录无法访问(它被路由到您的脚本,我预计会触发 404)。但是,您通常不想授予用户直接访问目录本身的权限 - 通常他们会返回 403。这些目录中的文件仍然可以访问,所以我认为这不太可能成为问题。

相关内容