-1

由于引号,当我单击超链接时出现 404 错误。MySQL 列title有这个值the official "i'm hungry" page

$title = str_replace(' ','-',$row['title']);
<a href='/page/$id/$title'>click me</a>

这是没有 modrewrite 的 urlhttp://localhost/page.php&id=7&p=the-official-"i'm-hungry"-page

modrewrite 将 url 更改为http://localhost/page/7/the-official-"i'm-hungry"-page但链接不起作用。

这是重写规则RewriteRule ^page/([A-Za-z0-9-]+)/([A-Za-z0-9-]+)?/?$ /page.php?id=$1&p=$2 [L]

我该如何解决这个问题,所以我没有收到 404 错误?

4

2 回答 2

1

通常,您希望通过其 ID 而非标题来识别您的页面。客户总是会尝试在他们的页面标题中添加奇怪的字符,例如"/'和。&这些字符可以断开链接。

http://example.com/page/1234/the+official+ “我+饿了”/“我+口渴”+page

此重写规则应收集页面的 ID,然后添加其他任何内容作为第二个变量:

RewriteRule ^page/([0-9]+)/(.*)$ /page.php?id=$1&p=$2 [L]

如果你这样做,那么标题就变得纯粹是装饰性的,你可以添加更严格的过滤器来防止意外行为(例如,如果用户创建了名为 的页面the official "i'm hungry"/"i'm thirsty" page,你可以将其转换为the-official-i-m-hungry-i-m-thirsy-pageURL,而不会影响你的网页内容。

例如,这两个链接都将您带到同一个地方:

http://stackoverflow.com/questions/12864634/htaccess-and-double-quotations-in-url
http://stackoverflow.com/questions/12864634/gibberishgibberishgibberish

如果您想强制用户访问具有正确标题的页面,则可以更新page.php以从 URL 中获取 ID,然后将用户重定向到正确、美观的 URL。例如:

<?php
function ConvertTitle($title)
{
    // Replace all non-alphanumeric characters with a dash (-)
    return preg_replace($title, '%[^A-z0-9]+%', '-');
}

$id = $_GET['id'];
$title = getArticleTitleById($id);

//  If the title isn't correct
if(ConvertTitle($title) != ConvertTitle($_GET['p'])
{
    //  Send the user to the correct Cosmetic URL, StackOverflow does something like this
    $url = '/page/'.$id.'/'. ConvertTitle($title);
    header("location: $url");
} 

// load the page as normal
?>

但是,只要您通过页面的 ID 而不是名称加载内容,那么即使使用不正确的 URL,它也应该可以正常工作。

于 2012-10-12T19:03:31.833 回答
0

代替str_replace您使用的,使用 apreg_replace从 the 中删除除字母和数字之外的任何内容,$title并将其替换为 a-

于 2012-10-12T18:09:36.210 回答