mod rewrite 忽略条件中的数字,如何让它考虑数字?

mod rewrite ignores digits in condition, how to make it take digits into account?

里面都搞定了httpd.conf,没有.htaccess

我有两个简单的条件。如果 url 中有字符串 "talis" 直接指向一个文件,否则指向另一个文件。

RewriteRule talis talis.php [L]
RewriteRule . index.php [L]

这件作品符合预期 [域]/t/1/talis/s 转到 talis.php [域]/t/1/bob/s 转到 index.php

但是当我尝试在其中输入数字时,它总是默认为最后一条规则

RewriteRule talis01 talis.php [L]
RewriteRule . index.php [L]

(通知talis01)

这总是会转到第二个条件。
[域]/t/1/talis01/s 转到 index.php
[域]/t/1/bob/s 转到 index.php

由于您使用的是相对 替换 字符串,因此我假设它们位于 目录 上下文中(可能是 .htaccess) ,而不是 server(或 virtualhost)上下文。第二条规则的 pattern 中的点也用于 directory 上下文。

mod_rewrite 不是“忽略数字”。请求被第一条规则重写为 talis.php,但随后 talis.php 被第二条规则重写为 index.php.

更详细...

RewriteRule talis talis.php [L]
RewriteRule . index.php [L]

在第一个示例中,包含 talis 的请求被重写为 talis.php,并且 L 标志导致重写引擎重新开始。在第二遍 talis.php 也匹配相同的规则并再次重写为 talis.php。由于 URL 未更改,处理停止并且 talis.php 接受请求。

如果不是因为第一条规则也匹配 talis.php(第一条规则重写为 URL),那么这也会导致请求被重写为 index.php.

RewriteRule talis01 talis.php [L]
RewriteRule . index.php [L]

在第二个示例中,包含 talis01 的请求首先被重写为 talis.php,并且 L 标志导致重写引擎重新开始。 talis.php 不匹配第一条规则,但它匹配第二条规则,因此请求被第二次重写为 index.phpL 标志导致重写引擎重新开始。第二条规则(再次)匹配,URL 未更改,因此处理停止并且 index.php 接受请求。

假设您使用的是 Apache 2.4,那么最简单的解决方案是在第一条规则中使用 END 标志,而不是 L。这将停止重写引擎的所有处理并防止另一个循环。

例如:

RewriteRule talis01 talis.php [END]
RewriteRule . index.php [L]

虽然,通常您会使用更严格的正则表达式 and/or 条件 来确保重写的请求不会被任何指令重新匹配(如果那不是意图)。例如。看到没有任何 conditions 的第二条规则是不寻常的,因为这实际上将 everything 重写为 index.php,包括对 index.php 的请求]本身。