同一.php页面的URL重写问题

时间:2009-08-25 08:38:04

标签: apache mod-rewrite url-rewriting

我遇到了一些mod_rewrite规则的问题。我必须制作两种类型的链接(第一种是针对有专辑的艺术家,第二种是针对没有专辑的艺术家): 1)/lyrics/artist-name/album-name/song-name.php 2)/lyrics/artist-name/song-name.php

我的代码如下所示:

RewriteRule ^lyrics/(.*)/(.*)/(.*).php$ /artists-lyrics.php?a=$1&b=$2&c=$3 [QSA,L]
RewriteRule ^lyrics/(.*)/(.*).php$ /artists-lyrics.php?a=$1&b=$2 [QSA,L]

可悲的是,只有第一条规则有效。如何更改它们以使它们都起作用?

谢谢。

3 个答案:

答案 0 :(得分:1)

您需要使您的模式更具体。尝试使用[^/]+(除/之外的一个或多个字符)而不是.*(任何长度的任何字符):

RewriteRule ^lyrics/([^/]+)/([^/]+)/([^/]+)\.php$ /artists-lyrics.php?a=$1&b=$2&c=$3 [QSA,L]
RewriteRule ^lyrics/([^/]+)/([^/]+)\.php$ /artists-lyrics.php?a=$1&b=$2 [QSA,L]

答案 1 :(得分:0)

第二条规则永远不会有效,因为第一条规则与“/lyrics/artist-name/song-name.php”匹配:(。*)表示:任意数量的字符(甚至为零)。

没有测试的可能性,这可能有效:

RewriteRule ^lyrics/([^\]+)/([^\]+).php$ /artists-lyrics.php?a=$1&b=$2 [QSA,L]
RewriteRule ^lyrics/([^\]+)/([^\]+)/([^\]+).php$ /artists-lyrics.php?a=$1&b=$2&c=$3 [QSA,L]

答案 2 :(得分:0)

通常,您希望将原子设置为尽可能严格,以避免意外后果。在下面的示例中,只接受字母数字字符(这可能是您想要的)。 +符号表示一个或多个,而*表示零或更多。

RewriteRule ^lyrics/([a-z0-9]+)/([a-z0-9]+)/([a-z0-9]+).php$ /artists-lyrics.php?a=$1&b=$2&c=$3 [QSA,L]
RewriteRule ^lyrics/([a-z0-9]+)/([a-z0-9]+).php$ /artists-lyrics.php?a=$1&b=$2 [QSA,L]