Regex .htaccess重写日期,即2012/12/31

Regex .htaccess重写日期,即2012/12/31,regex,.htaccess,mod-rewrite,clean-urls,multiple-value,Regex,.htaccess,Mod Rewrite,Clean Urls,Multiple Value,我试图创建一些重写规则,通过URL以一种简短、可读的方式按日期组织内容 i、 e 变成 http://mysite.com/post/Dave/2012/12/31/1 http://mysite.com/post/Dave/2012/12/31 http://mysite.com/post/Dave/2012/12 http://mysite.com/post/Dave/2012 http://mysite.com/post/Dave/all 这是我在//mysite.com/post中的.

我试图创建一些重写规则,通过URL以一种简短、可读的方式按日期组织内容

i、 e

变成

http://mysite.com/post/Dave/2012/12/31/1
http://mysite.com/post/Dave/2012/12/31
http://mysite.com/post/Dave/2012/12
http://mysite.com/post/Dave/2012
http://mysite.com/post/Dave/all
这是我在//mysite.com/post中的.htaccess/

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?([0-9]+)/?([0-9]+)/?([0-9]+)?$ index.php?a=$1&b=$2&c=$3&d=$4&e=$5 [L,NC,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?([0-9]+)/?([0-9]+)/?([0-9]+)/?$ index.php?a=$1&b=$2&c=$3&d=$4&e=$5 [L,NC,QSA]

RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?([0-9]+)/?([0-9]+)?$ index.php?a=$1&b=$2&c=$3&d=$4 [L,NC,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?([0-9]+)/?([0-9]+)/?$ index.php?a=$1&b=$2&c=$3&d=$4 [L,NC,QSA]

RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?([0-9]+)?$ index.php?a=$1&b=$2&c=$3 [L,NC,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?([0-9]+)/?$ index.php?a=$1&b=$2&c=$3 [L,NC,QSA]

RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)?$ index.php?a=$1&b=$2 [L,NC,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/?([a-zA-Z0-9]+)/?$ index.php?a=$1&b=$2 [L,NC,QSA]

RewriteRule ^([a-zA-Z0-9_-]+)$ index.php?a=$1 [L,NC,QSA]
RewriteRule ^([a-zA-Z0-9_-]+)/$ index.php?a=$1 [L,NC,QSA]
现在的问题是一些URL不起作用。从上述示例中,其中三个按预期工作。但其他的输出方式如下:

URL: http://mysite.com/post/Dave/2012/12
OUTPUTS:
    a => Dave
    b => 2012
    c => 1
    d => 2
URL: http://mysite.com/post/Dave/2012
OUTPUTS:
    a => Dave
    b => 20
    c => 1
    d => 2
这显然不是正确的值,显然是把数字分成了其他变量


它为什么会这样做?我必须做些什么来修复它?

不要到处说
/?
表示前面的表达式是可选的。这意味着
2012
匹配
([0-9]+)/?([0-9]+)/?([0-9]+)/?([0-9]+)/?
,因为这些斜杠不必在那里。您想要的是
([0-9]+)/([0-9]+)/([0-9]+)/?
,因为您希望URL末尾的斜杠是可选的。

所以这也意味着我不需要将前导斜杠的所有重写规则加倍?该解决方案工作得非常好,并修复了我遇到的其他类似问题,谢谢!前导斜杠在开头就是斜杠,所以我假设你指的是尾随斜杠。是的,这正是您使用
的目的。似乎你在所有错误的地方都使用了它们,而且没有一个是正确的;)是的,尾斜杠。我发现了一个页面,他们在那里这样使用它,我认为这与变量和模式匹配的位置有关,回想起来,这似乎很可笑。
URL: http://mysite.com/post/Dave/2012/12
OUTPUTS:
    a => Dave
    b => 2012
    c => 1
    d => 2
URL: http://mysite.com/post/Dave/2012
OUTPUTS:
    a => Dave
    b => 20
    c => 1
    d => 2