2017-08-17 86 views
3

我有一个名为names.php的页面,其中列出了年份最流行的名称。为什么当不包含URL变量时,htaccess重定向不起作用?

从今年开始,主菜单链接转到www.example.com/most-popular-names/2017。

这 “干净” 的URL被通过的.htaccess重定向这个规则:

RewriteRule ^/?most-popular-names/([^/]+)/?$ /names.php?year=$1 [L,QSA] 

这一切工作正常。但是,如果有人去:

www.example.com/most-popular-names (with no year specified) 

它进入404页面。它不应该仍然去names.php?在names.php上我有下面的代码说如果没有设置年份,只使用当前年份,但它是404',所以我认为它永远不会到达names.php。

$currentyear=date('Y'); 
if (!isset($_GET['year'])) { //if not set for some reason, default to current year 
    $theyear=$currentyear; 
} else { 
    $theyear=$_GET['year']; 
} 

是否有更好/不同的方式来编写重写规则来处理这种情况?我可以添加一个单独的重写规则来处理“no year”URL,但这对我来说似乎是错误的/不合适的。

回答

2

一个干净的方式做到这一点的是使URL的可变部分可选的:?

RewriteRule ^/?most-popular-names/?([^/]+)?$ names.php?year=$1 [L,QSA] 
+0

我代替我的这一个重写规则,现在踢一个“错误500 - 内部服务器错误”。 – user3304303

+0

日志说什么? – ishegg

+1

我错了,有一个错字。你的工作除了一个方面。它将$ _GET ['year']视为“/(年份)”。因此,如果网址以2017年结尾,$ _GET ['year']被视为“/ 2017”而不仅仅是“2017”。以前,它不包括“/”。我可以很容易地添加一个小功能去掉主要的斜线,但是如果有一种方法可以防止在重写代码 – user3304303

0

您需要添加其他规则来处理该问题。处理网址的地方有和没有结尾斜线和NO PARAMS。喜欢的东西:

Rewrite Rule ^/?most-popular-names[/].$ /names.php [L,QSA] 
相关问题