我已经阅读了几个小时的文章,但是由于没有控制台输出来调试 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+)
模式捕获子目录(estimate
、estimates
等等)。除非存在潜在冲突,否则似乎不需要通过名称明确检查子目录。例如,/estimates/1234
自然会被第一条规则捕获,而不是第二条规则,这可能是意图 - 但这取决于是否是有效的 URL。(这也许可以通过简单地检查目录名称的/estimates/1234
尾随来解决这个问题?)s
请注意,\w
匹配a-z
、A-Z
和0-9
(_
下划线)。如果子目录和/或“字符串”仅由字母(甚至只是小写字母)组成,则应使模式更加严格。如果是这种情况,则规则的顺序无关紧要,因为它会消除冲突。
您似乎不需要(相对昂贵的)文件系统检查,因为“限制性”正则表达式不应与真实文件匹配(除非文件系统上没有文件扩展名的文件?我认为不太可能)。
包装器<IfModule>
不是必需的,因为这些规则对于您的网站运行是必需的。
更新:请注意,我还删除了目录检查。如果您确实有其他形式为/estimates/<subdir>
等的子目录,那么这些指令可能会匹配,导致目录无法访问(它被路由到您的脚本,我预计会触发 404)。但是,您通常不想授予用户直接访问目录本身的权限 - 通常他们会返回 403。这些目录中的文件仍然可以访问,所以我认为这不太可能成为问题。