3

我在学习的过程中写了以下内容htaccess

RewriteRule ^/test(a-zA-z)\.htm$ /test$1.htm

并且test2.htm仍然被映射到test1.htm

我假设$1没有被正确地视为变量占位符,因为$没有转义。写这个的正确方法是什么(为了测试目的,test2.htm 被映射到自身,test2.thm

最终,我试图映射类似的东西:

domain.com/$1/$2domain.com/?a=$1&b=$2

或者

domain.com/$1domain.com/?a=$1

当第一个 url 映射到第二个时,我不希望浏览器的 URL 发生变化。我知道这在C# Global.asax文件中是可能的(使用routes.MapRoute),但不确定如何在php.

4

3 回答 3

2

从最复杂的到不太复杂的淘汰,继续进行。

  • 处理前 2 个参数,然后QSA是指令(重要)以保留所有GET变量,然后L是指令以停止所有变量,
  • 然后处理第一个参数,然后处理QSA指令(重要)以保留所有GET变量,然后L指令停止所有变量,

那应该工作:

RewriteRule ^/([a-zA-z0-9]+)/([a-zA-z0-9]+)$ /?a=$1&b=$2 [QSA,L]
RewriteRule ^/([a-zA-z0-9]+)$ /?a=$1 [QSA,L]

哦顺便说一句:

如果这还不够:

两个提示:

如果您不在托管环境中(= 如果它是您自己的服务器并且可以修改虚拟主机,而不仅仅是.htaccess文件),请尝试使用该RewriteLog指令:它可以帮助您追踪此类问题:

# Trace:
# (!) file gets big quickly, remove in prod environments:
RewriteLog "/web/logs/mywebsite.rewrite.log"
RewriteLogLevel 9
RewriteEngine On

我最喜欢的检查正则表达式的工具:

http://www.quanetic.com/Regex(不要忘记选择 ereg(POSIX) 而不是 preg(PCRE)!)

于 2012-07-23T08:27:04.813 回答
1

对我来说,这是我发现的最简单的文章,它真正帮助我弄清楚我需要什么并最终工作,所以我将在这里分享它并尝试使用对我有意义的术语。

http://www.workingwith.me.uk/articles/scripting/mod_rewrite

RewriteRule ^page/([^/\.]+)/?$ index.php?page=$1 [L]

右侧 ( index.php?page=$1) 是对浏览器隐藏的目的地。

左边是映射规则。

从左边解析的变量 -$1不必在字符串的末尾,可以在中间的任何地方,例如,/CHECK/?VAR=$1MORETEXT或者如果有更多的变量要从左边解析,它可以是“ /CHECK/?VAR=$1MORETEXT$2”。

/?”是可选的,如果希望目标URL/末尾没有“”,请不要包含它,只需以$like结尾^page/([^/\.]+)$

[L]很有用,因为一旦找到匹配的规则,它就会阻止 htaccess 浪费时间继续阅读。

于 2012-07-24T11:59:21.790 回答
1

当你想写一个范围之类的东西时,你应该使用[]. 例如:

RewriteRule ^/test([a-zA-z0-9]+)\.htm$ /index.php?data=$1  [L]
于 2012-07-23T04:59:30.193 回答