Apache URL重写不正常

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

该数字24id从一个MySQL表,其中也包含了随机行titlecontent领域.

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)

但是,我无法获得重写规则来将路径更改为所需的最终结果.

Ger*_*ben 2

首先,您需要更改 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)

我认为应该这样做。