带有htaccess规则的GET参数中的特殊字符

时间:2019-06-07 20:08:32

标签: php regex .htaccess

我的规则是使用免费的在线工具生成的。它们可以正常工作,直到某些特殊字符(例如 &/-- )为止 在 url 中显示为GET参数。我想获得干净且SEO友好的网址。

我发现了类似的问题,我试图在人们回答时使用正则表达式和标志来解决我的问题,但仍然无法正常工作。

How to handle special characters like & and / in .htaccess rules?

GET parameter doesn't work with htaccess rules

...以及许多其他答案。

我的htaccess

RewriteEngine On
RewriteRule ^all-books$ /bookIndex.php [L]
RewriteRule ^year/([^/]*)$ /bookIndex.php?year=$1 [L]
RewriteRule ^find-by-first-letter/([^/]*)$ /bookIndex.php?letter=$1 [L]
RewriteRule ^books-online/([^/]*)/about-book$ /book.php?book=$1 [L]

这就是我的使用方式。

页面和代码:

page: https://example.com/bookIndex.php 
url / a href: https://example.com/all-books
Rule: `RewriteRule ^all-books$ /bookIndex.php [L]`

带有GET参数的同一页面

url: https://example.com/year/[YEAR HERE]
link: echo "<a href=\"https://example.com/year/".$row["year"]."\">".$row["year"]."</a>";
Rule: RewriteRule ^year/([^/]*)$ /bookIndex.php?year=$1 [L]

url: https://example.com/find-by-first-letter/[FIRST LETTER HERE]
link: echo "<a href=\"https://example.com/find-by-first-letter/".$row1["letter"]."\">".$row1["letter"]."</a>";
Rule: RewriteRule ^find-by-first-letter/([^/]*)$ /bookIndex.php?letter=$1 [L]

正则表达式很好,因为GET参数可能只包含首字母或数字。我不确定标志,我猜标志很好。

出现问题的页面和代码

page: https://example.com/book.php 
url: https://example.com/books-online/[TITLE HERE]/about-book
link: <a href=\"https://example.com/books-online/".str_replace(' ', '-', $row2['title'])."/about-book\">".$row2['title']."</a>
RewriteRule ^books-online/([^/]*)/about-book$ /book.php?book=$1 [L]

如果$row2['title'] =“ The Book”`一切正常,但在以下情况下

$row2['title'] = "K-9000"
$row2['title'] = "24/7"
$row2['title'] = "You & Me"

我在浏览器中收到“页面无法正确重定向”错误。 我不知道为什么其他答案中的 rexeg 不起作用,我是否需要 RewriteCond%{QUERY_STRING}

str_replace(' ', '-', $row2['title'])>将 url 中的空格更改为“-”怎么办?

我确定现在这是错误的方法,因为我必须改回空格以获取原始标题以搜索数据库,而标题可能是“ K-9000 ”,但我不会得到任何结果。

我也应该使用 htaccess 吗?

1 个答案:

答案 0 :(得分:1)

您使用的消毒str_replace(' ', '-', ...)是不够的,您应该使用其他高级消毒。我创建了以下函数来清理标题,它将用破折号替换所有非字母数字字符:

/**
 * Replace all not non-alphanumeric characters with dashes
 *
 * @var string $title
 * @return string
 */
function sanitize_title(string $title) {
    $title = strtolower($title);
    $title = str_replace('&', 'and', $title);
    $title = preg_replace('/([^a-z0-9]+)/', '-', $title);
    $title = trim($title, '-');
    return $title;
}

然后,当您打印链接时:

<a href="https://example.com/books-online/" . sanitize_title($row2['title']) . "/about-book">".$row2['title']."</a>

示例:

One Hundred Years of Solitude: one-hundred-years-of-solitude
       Breakfast at Tiffany's: breakfast-at-tiffany-s
                     Catch-22: catch-22
             Carry On, Jeeves: carry-on-jeeves
            Man & His Symbols: man-and-his-symbols
                  I, Claudius: i-claudius