【问题标题】:Add trailing slash to url在 url 中添加斜杠
【发布时间】:2011-02-20 07:53:50
【问题描述】:

我正在尝试使用 PHP 在 URL 中添加斜杠。它不能用 mod_rewrite 完成,因为我在 .htaccess 中有类似的东西:

RewriteRule ^page/(.*)$ index.php?page=$1 [L]

我想验证该页面在 301 重定向之前是否存在,并带有斜杠。

现在我在验证后使用此代码:

if(substr($_GET['page'], -1) !== '/')
  header('Location: http://example.com/'.$_GET['page'].'/'.$_SERVER['QUERY_STRING'],TRUE,301);

但是有没有更好的方法呢?

【问题讨论】:

  • 我不明白你可以把它作为一个mod重写吗?
  • 我不想为不存在的页面添加尾部斜杠,例如example.com/page/fokwaofkw 变为 example.com/page/fokwaofkw/
  • 你如何检查请求的资源是否存在?
  • 假设请求是 /page/1 ,实际上是 /index.php?page=1 ,我需要验证页面“1”是否存在于我的数据库中,然后再使用斜杠进行重定向
  • 通常你会使用 apache RewriteConditions 来做到这一点。但是,如果您坚持只为坚持的page 在网址中添加斜杠,则只有在验证页面存在后才能在代码中执行此操作。

标签: php mod-rewrite


【解决方案1】:

简单的方法是删除 url 末尾的斜线并添加它

$str = "http://yoursite.com/testpage"; 

OR 

$str = "http://yoursite.com/testpage/";


echo rtrim($str,"/").'/';

【讨论】:

【解决方案2】:

您已经有了最好的解决方案。我只会使用$_SERVER['REQUEST_URI'] 而不是已经解析的$_GET['page']$_SERVER['QUERY_STRING']

if (substr($_GET['page'], -1) !== '/') {
    $parts = explode('?', $_SERVER['REQUEST_URI'], 2);
    $uri = 'http://example.com'.$parts[0].'/'.(isset($parts[1]) ? '?'.$parts[1] : '');
    header('Location: '.$uri, true, 301);
    exit;
}

【讨论】:

  • 为什么不用explode()直接使用$_SERVER['REQUEST_URI']?那不应该产生同样的结果吗?
  • @Ibrahim AshShohail:$_SERVER['REQUEST_URI'] 包含最初请求的 URI 路径和查询。使用explode,您可以在? 分隔符处将其拆分,以将缺少的/ 放在URI 路径的末尾,如果它已经存在于最初请求的URI 中,则重新附加查询。
  • 我的错...我认为 REQUEST_URI 将是“pages/1/”,所以这首先违背了目的。 =) 谢谢,秋葵。
  • @Ibrahim AshShohail:实际上,mod_rewrite 的 REQUEST_URI 与 PHP 的 REQUEST_URI 不同。这可能会引起一些混乱。
【解决方案3】:

这是我的通用解决方案,希望对某人有所帮助:

 $site_adress = (((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') ? 'https' : 'http') . '://' . $_SERVER['HTTP_HOST'];
$whole_url = $site_adress . $_SERVER['REQUEST_URI'];


$pos = strpos($whole_url, "?");
$changed_url = FALSE;
if($pos !== FALSE && $whole_url[$pos - 1] != "/") {
    $whole_url = substr_replace($whole_url, "/", $pos, 0);
    $changed_url = TRUE;
} else if($pos == FALSE && substr($whole_url, -1) != '/') {
    $whole_url = $whole_url . "/";
    $changed_url = TRUE;
}
if($changed_url) {
    header("HTTP/1.1 301 Moved Permanently");
    header("Location: " . $whole_url);
    exit();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    • 2012-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-18
    相关资源
    最近更新 更多