有没有办法通过mod_rewrite隐藏部分Url。我目前正在使用url的一部分.htm来拆分正在请求的页面和查询字符串。
实施例
http://www.example.com/page/article/single.htm/articleid=8
这会让我知道所请求的页面是:
http://www.example.com/page/article/single
任务字符串是:
article=8
理想情况下,我希望在没有.htm可见的情况下使用相同的网址
http://www.example.com/page/article/single/articleid=8
查询sting中的变量数量与.htm之前的级别数量不同,因此规则需要是动态的
由于
答案 0 :(得分:1)
要同时执行多个查询字符串参数,您希望它看起来如何?我从这开始,这使得这很简单,然后在下面变得更加棘手。
http://www.example.com/page/article/single/articleid=8&anothervar=abc
尝试此规则:
RewriteRule ^([^=]+)/(.+)$ $1.htm?$2 [NC,L]
这会处理一个或多个查询字符串参数,但至少需要一个。这样可以查找没有=
到斜线的任何内容,然后是其他所有内容。基本上,它使用=
作为路径与查询字符串部分的指示符;但实际上它是在斜线上分开的。 (NC是我的习惯;在这种情况下不需要,但是当我把它遗漏时,我会在需要时忘记它。)
让querystrings是可选的,所以它只能处理
http://www.example.com/page/article/single
我发现使用两条规则最简单,而不是试图将其混合成一条规则:
RewriteRule ^([^=]+)$ $1.htm [NC,L]
RewriteRule ^([^=]+)/(.+)$ $1.htm?$2 [NC,L]
你可以做一些更漂亮的事情,使用斜杠包括多个查询字符串参数,如下所示:
http://www.example.com/page/article/single/articleid=8/anothervar=abc
它有点毛茸茸,但我觉得这很有效(不能让它去......)
另一条规则处理用&符号替换斜杠,然后按上述方法进行重写。这更容易保持直线 - 也许有一种方法可以同时做到这一切,但这对我来说非常棘手:
RewriteRule ^([^=]+)$ $1.htm [NC,L]
RewriteRule ^([^=]+)/([^=]+=[^/]+)/([^=]+=.+)$ $1/$2&$3 [NC,LP]
RewriteRule ^/([^=]+)/(.+)$ /$1.htm?$2 [NC,L]
第一条规则如上所述,根本不处理任何查询字符串。这只是让它不受影响。
第二个规则是一个循环LP
,这是我在每个你有未知数量的替换时在示例中找到的。在这种情况下,它用一个&符号替换最后一个querystring-slash,然后循环直到只剩下一个(在第三个规则中留下问号)。
正在寻找剩下两个参数的articleid=8/anothervar=abc
中的最后一个。它用像articleid=8&anothervar=abc
用语言来说,它正在寻找(并在括号中捕捉):
(not-equalsign) slash (not-equalsign equalsign not-slash) slash (not-equalsign equalsign anything)
这就是:
(not-equalsign) /page/article/single
slash /
(not-equalsign equalsign not-slash) articleid = 8
slash /
(not-equalsign equalsign anything) anothervar = abc
它用一个与号替换最后一个斜杠,并在循环之后将其转换为上面的第一个草稿:http://www.example.com/page/article/single/articleid=8&anothervar=abc
。第三条规则如上所述处理此问题。
注意:这些也假设您的所有网址都是这样的,因为他们会将.htm用于所有内容。如果你想仍然允许显式/something/page.htm
那么这些规则就不需要匹配.htm如果它已经存在 - 就像那样。或者可能是前面的初始规则,它会查找.htm并停止重写。或者也许只对/ page路径执行此操作。