【问题标题】:Problem with URL rewriting for same .php page同一 .php 页面的 URL 重写问题
【发布时间】:2009-08-25 17:01:02
【问题描述】:

我遇到了一些关于 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]

遗憾的是,只有第一条规则有效。如何更改它们以使它们都工作?

谢谢。

【问题讨论】:

    标签: apache mod-rewrite url-rewriting


    【解决方案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]
    

    【讨论】:

    • 仍然不工作的家伙。也许是因为我有另一个规则: RewriteRule ^lyrics/(.*)/(.*)$ /artists-albums.php?a=$1&b=$2 [QSA,L]
    • @Psyche:所以你没有尝试我提出的规则?
    • 我试过了,但正如我所说,它们似乎不起作用。我认为这与我上面粘贴的规则有冲突。
    • @Psyche:你不应该在你的之外使用我提出的规则,而是作为你的替代。
    • @psyche:请将其他规则也添加到问题中 - 并确保它们按照出现的顺序排列。
    【解决方案2】:

    第二条规则永远不会起作用,因为第一条规则也匹配“/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]
    

    【讨论】:

    • 我得到一个 500 服务器错误与这些规则:(
    【解决方案3】:

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

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-19
      • 1970-01-01
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多