Apache的URL重写功能不正常(Apache URL Re-writing not functi

2019-07-04 03:26发布

我想使用Apache的重写规则,下面的URL转换:

http://localhost/foo/bar/news.php?id=24

成这种格式:

http://localhost/foo/bar/news/foo-bar

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

MariaDB [blog]> select * from articles;
+----+---------+----------+ 
| id | title   | content  |
+----+---------+----------+ 
|  1 | foo-bar | bla bla  | 
+----+---------+----------+ 
1 row in set (0.00 sec)

我有我的里面以下规则.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]

我也有一个生成这样一个链接PHP代码:

$link = "<a href='news.php?id={$row['id']}'></a>";
echo $link;  

但是,我不能重写规则改变路径所需的最终结果。

Answer 1:

首先,你需要改变的href在html,给新的网址格式

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/>".; }
}

该会产生像URL http://localhost/news/24

请注意,我删除了/DIRECTORY/AID从URL,如htaccess的建议你想要的是URL,而不是你的文字说明。

但现在获取到http://localhost/news/this_is_article_title类型的URL。 由于之间不存在相关性this_is_article_title和ID 24 ,实现这一目标的唯一途径是通过添加该ID的网址也还是有PHP查找新闻,文章与这个称号在数据库中。

然而,这最后的解决方案有一些问题,因为你不能只是我们在URL标题。 你必须转义字符。 您还可以添加在DB标题行中的指数有更好的表现。

所以,我会第一个解决方案去。 我们会产生这样的网址

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/>".; }
}

接下来是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]

应该这样做,我认为。



Answer 2:

取代(真实)地址有许多-Code-识别链接(根据你的描述):HTTP://localhost/DIRECTORY/AID/news.php新闻= 42

该代码是在这种情况下42,但你要显示的URL没有它。 如果没有这个数字,我们会得到错误404始终。 这就像只有进入:HTTP://localhost/DIRECTORY/AID/news.php新闻=

有通过添加代码之后“/”,例如修改要显示的URL。 可以是一个连字符,等等,但是该正则表达式必须被相应地修改。

下面是一个例子进入:HTTP://本地主机/新闻/ 42 /访问http://localhost/DIRECTORY/AID/news.php新闻= 42:

RewriteEngine On
RewriteRule ^news/([0-9]+)/?$ DIRECTORY/AID/news.php?news=$1 [NC,L]

这就是你需要的。 为了测试本实施例中,在http插入news.php这个唯一的代码://本地主机/目录/ AID /

<?php
if ( $_GET[ 'news' ] == '42' ) {
  echo  "HERE I AM<br /><br />";
}
?>

根据OP描述更新。 任何名称可以用来代替This_is_news的:

RewriteEngine On
RewriteRule ^news/([0-9a-zA-Z-_]+)/?$ DIRECTORY/AID/news.php?news=$1 [NC,L]


Answer 3:

将RewriteBase RewriteEngine叙述之后在将设置重写引擎正常启动之前重定向



Answer 4:

不幸的是,我不能回答在PHP或Apache(虽然我使用的是手卷REST转换器来创建我的当前项目的URL地址)你的问题,但是从我的理解,你希望你的用户键入了HTTP:/ /localhost/DIRECTORY/AID/article.php?a_id=24和地址栏应该结束了如http://本地主机/目录/ AID /新闻/ this_is_article_title。

我不能完全肯定有什么好处这提供了你,请记住我的解决方案将不会允许您的最终用户键入的URL的RESTful以及与查询字符串地址的页面结束。 你会需要一些额外的跑腿要做到这一点,甚至更多的跑腿,以保持它与数据库同步(我建议deseminates REST风格的URL,查询数据库的话题,然后返回ID或页面内容的脚本。 ..但是这是另一天的不同的堆栈溢出的问题。

解决方案:我提出的解决方案需要HTML5文档类型和JavaScript 很轻洒。

history.replaceState(null, "history title here", "news/this_is_article_title");

这样做是它改变了地址栏中的网址,而不会触发页面重定向,重装或其他任何东西。 这个JavaScript可以与你的PHP动态写入,以便在页面一经送达,地址更新。 在文档中的上涨是,更快的变化。

这里有一个的jsfiddle链接: http://jsfiddle.net/uT3RP/1/

不幸的是,他们运行的代码的iframe因此它不控制主地址栏,所以我包括显示地址栏的位置会说些什么,举证警报。 这不是最优雅的解决方案。 我甚至不建议这样做你不确保显示的URL可以用来获取到同一页的failsafes做什么。 免责声明一边......你的问题的解决,是1号线的JS和DOCTYPE变化(如果你不使用HTML5)。

您可以停止鞭打穷醇” htaccess以及与项目得到:)



Answer 5:

这是一个关于URL重写的和字符串到ID的算法问题。

总之,请记住,什么都被重写模块的URL变化,浏览器栏中的URL始终包含交PARAM像ID或字符串(关于你的消息)。

现在的问题。 我们的目的就是要改写的网址:

http://localhost/DIRECTORY/AID/news/this_is_article_title

至:

http://localhost/DIRECTORY/AID/news.php?a_id=24

随着重写模块,我们只能将其改写为:

http://localhost/DIRECTORY/AID/news.php?title=this_is_article_title

这里是htaccess的部分,在alrealdy测试htaccess的,在线测试仪

RewriteRule ^DIRECTORY/AID/news/([A-Za-z0-9_]+)$ DIRECTORY/AID/news.php?title=$1 [QSA,L]

剩下的工作就是建立映射标题到改写模块不能帮助我们的新闻算法(尤其是你手动一个重写URL一个)。 我们可以使用下面的PHP代码:

<?php

//write url reflect to news title.
function build_news_url_by_title(){
    $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/".strtr(substr($row['title'], 0,26), " ", "_")."\">".substr($row['title'], 0,26)."</a>";
    }   
}

function get_news_by_title($title){
    $real_title = strtr($title, "_", " ");
    $query = "SELECT * FROM news WHERE title LIKE %".$real_title."% LIMIT 1";
    return mysql_query($query) or die(mysql_error());
}

$title = $_POST['title'];

$news = get_news_by_title($title);

//some code return the news
...

所以,网址:

http://localhost/DIRECTORY/AID/news/this_is_article_title

能不能给我们的消息也。

最后,从上面的步骤,如果我们输入网址

http://localhost/DIRECTORY/AID/news/this_is_article_title

在浏览器栏,它也可以给我们的消息。 它大约有愚蠢的ID没有经营业务。 虽然,有可能一些错误与上面的代码中,不要把你的产品服务器上。



Answer 6:

你可以看到,如果这个工程?

RewriteEngine On
RewriteBase /DIRECTORY/AID/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
^news/([A-Za-z0-9_]+)$ news.php?id=$1 [QSA,L]

编辑:修正了正则表达式字符类定义。



Answer 7:

你缺少URL的标题。 如果你想表明,在URL,则必须将其包含在该链接为好,就像这样:

<a href="news.php?news_id=$id&title=$url_tile">


Answer 8:

这似乎是一个复杂的问题,因为你不知道它确实是做错了。

我建议你把你想要做成小部分,让你一起参加他们之前他们每个人的正常工作是什么。 例如:

 1. Make sure .htaccess file is readable and can do some simple thing, preventing directory indexing for instance.
 2. Make sure you can redirect something with simple html code.
 3. Make sure you can run Felipe's example code successfully. From here you can get good picture of what is going on. 

而作为一个侧面说明:

这是比较常见的改写是这样的:

http://localhost/DIRECTORY/AID/news.php?a_id=24 TO -->
http://localhost/DIRECTORY/AID/news/24_this_is_article_title 

注意ID 24仍结转到重写后的URL。 这将使模式匹配简单,避免重复标题不必要的处理。



Answer 9:

更改链接:

echo "<a href=\"news.php?news=$row[id]\"> ". substr($row['title'], 0,26)."</a>

echo "<a href=\"news/$row['title']\">".$row['title']."</a>"

这样一来,该链接会去news/$row['title']而不是news.php?id=... 。 现在在页面DIRECOTORY/AID/news.php ,你应该得到的id ,并检查它是否是一个数字文字,在文字的情况下,与匹配起来$row['title']然后加载页面因此。

笔记:

  1. 这假设$行[“标题”]在所有其他行是唯一的。
  2. 标题中不包含非HTML内容,在这种情况下,你将不得不URL转义这些字符。

如果标题不会是唯一的,那么你或许应该做news/{id}/{title}然后重写它DIRECTORY/AID/news.php?id={id}&title={title} ,然后你可以基地它关闭的ID而不是标题的。

希望帮助。



Answer 10:

如果你觉得你.htaccess如预期的文件不能正常工作,那么这是一个服务器的配置问题,最有可能与做AllowOverride Apache配置下的指令。

在你http.conf文件中找到它看起来是如下的部分:

<Directory>
    Options FollowSymLinks
    AllowOverride None
</Directory>

更改AllowOverride指令允许All

<Directory>
    Options FollowSymLinks
    AllowOverride All
</Directory>

接下来的事情是要确保mod_rewrite为您的XAMPP安装模块启用。 搜索以下行:

#LoadModule rewrite_module modules/mod_rewrite.so

删除# ,所以它看起来像这样:

LoadModule rewrite_module modules/mod_rewrite.so

保存所有更改后, 重新启动Apache服务

此外,还要确保您使用的是RewriteBase指令在你.htaccess配置如下:

RewriteEngine On
RewriteBase /DIRECTORY/AID/
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-l
^news/([A-Za-z0-9_]+)(/)?$ news.php?title=$1 [QSA,L]

接下来的事情是要确保你的链接都指向了重写URL。 你的回声线应该是这样的:

echo "<a href=\"news/" . $row['title'] . "\">  " . substr($row['title'], 0, 26) . "...</a><br />";

现在,因为你只能检索与我们需要相应地配置您的PHP脚本来检索基于标题内容这个URL重写方法标题。 如果你仍然想使用“ID”仅用于检索记录那么你重写URL应该包含以某种形式在其中的“身份证”。 这种形式的典型实例是:

  • news/the_news_title_123
  • news/123_the_news_title
  • news/123/the_news_title


Answer 11:

我不能评论,所以我必须回答的问题。

阅读所有的答案,你的问题,目前还不清楚你想要什么。 至少对于我来说。 你说,例如:

http://localhost/DIRECTORY/AID/article.php?a_id=24

http://localhost/DIRECTORY/AID/article/this_is_article_title

但我想这是不完全正确的,除非你想

http://localhost/DIRECTORY/AID/article.php?a_id=24

要在URL在浏览器地址栏中输入如果是这样,这将是重定向的目的是什么? 最后,任何访客就必须准确键入你不希望他们输入的内容。

我的猜测是,你要进入友好的URL:

http://localhost/DIRECTORY/AID/article/this_is_article_title ,所以问题应该是周围的其他方式:

http://localhost/DIRECTORY/AID/article/this_is_article_title TO

http://localhost/DIRECTORY/AID/article.php?a_id=24

这似乎并不清楚接下来的事情,是什么显示在浏览器栏? 唯一的答案是:输入的URL。 没办法,它可以显示什么不同。

简而言之:如果你想的http://本地主机/目录/ AID /条/ this_is_article_title在ADDRES栏上显示,那你有什么进入。 真正的URL,替代(HTTP://localhost/DIRECTORY/AID/article.php A_ID = 24?),从未显示,并且永远不会打字。 这就是重定向的。

在另一方面,目前尚不清楚如何要么通过news.php提供的ID号被预期要转换成像文章/ this_is_article_title字符串。 ¿在哪里这些字符串,多少个ID号码,应该用什么样的算法或公式来实现这一转换,为您在留言中提到其中这些ID是“根”,如何对它们进行识别,等等?因为它似乎即兴和非相干与你先前的评论,您应该更多地讨论这一点。

我可能是错的,当然。 我只是猜测,试图帮助你的问题。

请天才,不要downvote这个答案,阅读它。 我不是想回答这个问题,我不是一个真正的天才远。



Answer 12:

看起来你已经忘记了在“news.php”前斜线。



文章来源: Apache URL Re-writing not functioning properly