sam*_*ayo 8 php apache .htaccess url-rewriting
我正在尝试使用apache-rewrite规则来转换以下URL:
http://localhost/foo/bar/news.php?id=24
进入这种格式:
http://localhost/foo/bar/news/foo-bar
该数字24是id从一个MySQL表,其中也包含了随机行title和content领域.
MariaDB [blog]> select * from articles;
+----+---------+----------+
| id | title | content |
+----+---------+----------+
| 1 | foo-bar | bla bla |
+----+---------+----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
我的内容中有以下规则.htaccess:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
^news/([A_Za_z0_9_]+)$ DIRECTORY/AID/news.php?id=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)
我也有一个PHP代码生成这样的链接:
$link = "<a href='news.php?id={$row['id']}'></a>";
echo $link;
Run Code Online (Sandbox Code Playgroud)
但是,我无法获得重写规则来将路径更改为所需的最终结果.
首先,您需要更改 html 中的 href,以提供新的 url 格式
function news_preview() {
$query = "SELECT * FROM news ORDER BY id DESC LIMIT 5 ";
$result = mysql_query($query) or die(mysql_error());
while($row=mysql_fetch_array($result))
{
echo "<a href=\"/news/$row[id]\"> ". substr($row['title'], 0,26)."...</a><br/>".; }
}
Run Code Online (Sandbox Code Playgroud)
将生成如下网址http://localhost/news/24
请注意,我/DIRECTORY/AID从 url 中删除了 ,因为 htaccess 建议您希望它是 url,而不是您在文本中所述的内容。
但现在获取的是http://localhost/news/this_is_article_titleurl 的类型。this_is_article_title因为和 id之间没有关联24,所以实现这一点的唯一方法是将 id 添加到 url 中,或者让 php 在数据库中查找具有此标题的新闻文章。
然而,最后一个解决方案存在一些问题,因为您不能只使用网址中的标题。你必须转义字符。此外,您还必须在数据库中为标题行添加索引以获得更好的性能。
所以我将采用第一个解决方案。我们将生成这样的网址
http://localhost/news/24/this_is_article_title
首先是php部分
function news_preview() {
$query = "SELECT * FROM news ORDER BY id DESC LIMIT 5 ";
$result = mysql_query($query) or die(mysql_error());
while($row=mysql_fetch_array($result))
{
$url = "/news/$row[id]/".preg_replace('/[^a-zA-Z0-9-_]/', '_', $row['title']);
echo "<a href=\"$url\"> ". substr($row['title'], 0,26)."...</a><br/>".; }
}
Run Code Online (Sandbox Code Playgroud)
接下来是 htaccess 部分。
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
RewriteRule ^news/([0-9]+)/([A-Za-z0-9_-]+)$ DIRECTORY/AID/news.php?id=$1 [QSA,L]
Run Code Online (Sandbox Code Playgroud)
我认为应该这样做。