通过mod_rewrite删除部分网址

时间:2011-07-24 21:24:54

标签: .htaccess mod-rewrite url-rewriting rewrite

有没有办法通过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之前的级别数量不同,因此规则需要是动态的

由于

1 个答案:

答案 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路径执行此操作。