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.php
。 L
标志导致重写引擎重新开始。第二条规则(再次)匹配,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
的请求]本身。
里面都搞定了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.php
。 L
标志导致重写引擎重新开始。第二条规则(再次)匹配,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
的请求]本身。