【问题标题】:regex php url title escaping正则表达式 php url 标题转义
【发布时间】:2012-12-14 10:48:58
【问题描述】:

您好,我正在制作一个网站,当用户添加 amps 或斜杠作为他提交的文章的标题时,我遇到了 htaccess clean url 重定向问题。我决定只允许特定字符,如字母数字, -、_、@、[、]。没有引号或双引号等...

我似乎无法使正则表达式工作我对正则表达式没有很好的经验,而不是使用字符串替换我想我应该问。

也将非常感谢有关此问题的任何其他建议

在我的 htaccess 中,我有以下设置:

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

在我的索引中我有:

include 'db.php';
include 'generic.php';

$pages = array('','main','events','news','rss','search','add-event');

if(isset($_GET['page']) && in_array($_GET['page'], $pages))
{
    $event_category = null;
    $event_title = null;
    $search_string = null;
    $rss_category = null;
    $events_date = null;
    $search_page = null;

    validate_evented_page(trim(urldecode($_GET['page'])));
}
else
{
    evented_error_page(404);
}

function evented_error_page($err)
{
    include('errorpages/error.php');
}

function validate_evented_page($p)
{
    $page = strtolower($p);

    global $event_category;
    global $event_title;
    global $search_string;
    global $rss_category;
    global $events_date;
    global $search_page;

    if($page == 'main' || strlen($p) == 0)
    {   
        include 'main.php';
    }
    else if($page == 'events')
    {
        $params = explode_url($_GET['request']);

        if(count($params) == 0)
        {
            $events_date = "'';";
            include 'allevents.php';
        }
        else if(count($params) == 1)
        {   

            if(check_date($params[0]))
            {
                $date_split = explode('-',$params[0]);
                $events_date = "'".date("m/d/Y" , mktime(0, 0, 0, date('m'), $date_split[1], date('Y')))."';";
            }
            else
            {
                $events_date = "'';";
            }

            include 'allevents.php';
        }
        else if(count($params) == 2)
        {
            $event_category = trim(urldecode($params[0]));
            $event_title = trim(urldecode($params[1]));

            include 'event.php';
        }
        else
        {
            evented_error_page(404);
        }

    }
}

以下网址:

/events/Drum+%26+Bass/Innersense+presents+ETHOS_v04-0

给 $_GET['request'] = /Drum

什么时候应该是 Drum & Bass(在数据库中我将​​此类别存储为“Drum & Bass”)。

【问题讨论】:

  • 通常人们会去掉除字母数字和破折号以外的所有字符来生成 slug。您想在 URL 中使用 &(等)有什么原因吗?
  • 另外,+ 应该是 %20
  • 其实这是一个朋友的网站,最初是在 joomla 中设计的,现在我正在从头开始构建它 php、mysql javascript 等。这次没有 cms。他有像 Drum & Bass 这样的类别,这些类别在 url 中使用,但我不记得 url 中是否显示了放大器。目前,我已将数据库中的所有类别更改为仅包含字母数字和 - 但是在某些情况下,客人可能会添加一个标题如下的活动 [Dubstep event] "New Year's Eve" @'ClubName' dd/mm/yyyy DJ:dj1/dj2/dj3/'dj4'。或者想到什么......所以我想知道我应该如何处理这个......
  • 你会遇到 url 中的斜杠问题,因为即使你将它们编码为 %2F 你仍然需要在 Apache 配置中设置 AllowEncodedSlashes 指令以使其工作。将斜杠更改为连字符或下划线。
  • 是的,我在想,我也注意到 %26 会导致错误

标签: php regex .htaccess url-rewriting


【解决方案1】:

您需要告诉 mod_rewrite 使用 B 标志对在反向引用中分组的 & 进行编码:

RewriteRule ^([^/]*)(.*)$ /index.php?page=$1&request=$2 [B,L]

URI 在通过重写引擎发送时被解码。所以%26 被解码为&B 标志确保它被重新编码为反向引用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-18
    • 2012-03-11
    • 1970-01-01
    • 1970-01-01
    • 2016-04-02
    • 2013-06-26
    相关资源
    最近更新 更多