【问题标题】:Why is htaccess redirect not working when URL variable is NOT included?为什么不包含 URL 变量时 htaccess 重定向不起作用?
【发布时间】:2017-08-17 15:02:57
【问题描述】:

我有一个名为 names.php 的页面,它按年份列出了最受欢迎的名字。

主菜单链接为 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'];
}

是否有更好/不同的方法来编写重写规则来处理这种情况?我可以添加一个单独的重写规则来处理可能的“无年份”URL,但这对我来说似乎是错误的/效率低下。

【问题讨论】:

    标签: php .htaccess redirect


    【解决方案1】:

    一种简洁的方法是使用 ?: 将 URL 的可变部分设为可选

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

    【讨论】:

    • 我用这个替换了我的 RewriteRule,它现在启动了“错误 500 - 内部服务器错误”。
    • 日志是怎么说的?
    • 我错了,有错字。你的工作除了一个方面。它将 $_GET['year'] 视为“/(年份)”。因此,如果 url 以 /2017 结尾,则 $_GET['year'] 将被视为“/2017”,而不仅仅是“2017”。以前,它不包括“/”。我可以很容易地添加一个小功能来去除前导斜线,但想提一下,以防在重写规则中有一种方法可以防止这种情况发生
    • 很高兴它成功了。无论如何,我编辑了答案,以使前导斜杠成为另一组的一部分。现在它是可选的,你也可以干净地度过你的一年。
    【解决方案2】:

    您需要添加另一个规则来处理它。处理带有和不带有结尾斜杠和无参数的 url 的东西。比如:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2014-11-25
      • 1970-01-01
      相关资源
      最近更新 更多