htaccess问题和一般正则表达式

时间:2011-05-30 19:44:48

标签: php .htaccess mod-rewrite

我的htaccess重写有问题。

该行是:

RewriteRule ^sports/([^/\]+)/?([^/\]+)/?([^/\.]+)/?$ index.php?v=sports&title=$1&go=$2&d=$3 [L]

此网址:http://localhost/host/sports/other/ - >它会导致:

***object(url)[3]
  public 'v' => string 'sports' (length=6)
  public 'title' => string 'other' (length=5)*** ( these are the var_dump of Gets);

到目前为止,对于这个网址,这个网址的所有细节都很好: http://localhost/host/sports/baseball/aliasss/ 它会导致:404找不到,我必须修改正则表达式并添加'。'这样:

RewriteRule ^sports/([^/\]+)/?([^/\.]+)/?([^/\.]+)/?$ index.php?v=sports&title=$1&go=$2&d=$3 [L]

它工作正常。但如果我保留点,并检查旧网址,只有2个文件夹,它将导致:

object(url)[3]
  public 'v' => string 'sports' (length=6)
  public 'title' => string 'basebal' (length=7)
  public 'go' => string 'l' (length=1)

如果您看到链接是/sports/basebal/l而不是/sports/baseball,则查询中缺少1个字母,HELP! 谢谢:))


在我添加两行n两种情况后,它工作正常:

RewriteRule ^sports/([^/\]+)/?([^/\.]+)/?$ index.php?v=sports&title=$1 [L]
RewriteRule ^sports/([^/\]+)/?([^/\.]+)/?([^/\.]+)/?$ index.php?v=sports&title=$1&go=$2&d=$3 [L]

但我不认为这是正确的方法,这意味着如果我想要另一个级别,我必须添加另一行... humph

1 个答案:

答案 0 :(得分:1)

在你的情况下,我想我会用这个:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^sport/(.*?)/(.*?)/(.*?)/$ test.php?v=sport&a=$1&b=$2&c=$3

但通常我更喜欢

RewriteRule (.*) index.php?get=$1

然后使用php

解析所有网址

在你的代码中,你犯了一些错误,比如[^/\]+ ....通常你必须像我上面提到的那样用向后的斜线来逃避正斜杠,

在这种情况下[^\/.]+您不需要点,因为[^\/]表达式匹配除正斜杠之外的任何内容

你不需要/?(可选正斜杠),因为它们之间的文字不是可选的,你可能会得到整个网址为$1 ....也许只是最后一个是有用