【问题标题】:.htaccess rewrite for date i.e. /2012/12/31.htaccess 重写日期,即 /2012/12/31
【发布时间】:2012-12-15 19:50:09
【问题描述】:

我正在尝试创建一些重写规则,以通过 URL 以简短易读的方式按日期组织内容。

http://mysite.com/post/index.php?a=Dave&b=2012&c=12&d=31&e=1
http://mysite.com/post/index.php?a=Dave&b=2012&c=12&d=31
http://mysite.com/post/index.php?a=Dave&b=2012&c=12
http://mysite.com/post/index.php?a=Dave&b=2012
http://mysite.com/post/index.php?a=Dave&b=all

变成

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

这显然不是正确的值,显然将数字拆分到其他变量中。

为什么会这样?我必须怎么做才能修复它?

【问题讨论】:

    标签: regex .htaccess mod-rewrite clean-urls multiple-value


    【解决方案1】:

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

    【讨论】:

    • 所以这也一定意味着我不需要为前导斜杠加倍所有重写规则?该解决方案效果很好,并解决了我遇到的其他类似问题,谢谢!
    • 前导斜杠是开头的斜杠,所以我假设您的意思是尾随斜杠。是的,这正是您使用? 的目的。看来您在所有错误的地方都使用了它们,而没有一个是正确的;)
    • 是的,斜杠。我找到了一个页面,他们正在使用它,我认为这与变量和模式匹配的地方有关,回想起来似乎很荒谬。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多