我想使用Apache的重写规则,下面的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)
我有我的里面以下规则.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']
然后加载页面因此。
笔记:
- 这假设$行[“标题”]在所有其他行是唯一的。
- 标题中不包含非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:
文章来源: Apache URL Re-writing not functioning properly