当我点击我所拥有的网站上给定条目的评论部分时,网址如下所示:
我想让它看起来像这个网址:
http://www...com/.../comments/Portugal-Crushes-North-Korea-62
据我所知,这涉及到.htaccess文件中添加规则。我有两个问题:
由于我在PHP中使用GET方法,因此丑陋的URL会附加一堆变量。我不希望所有这些变量出现在干净的URL中。是否可以仅在干净的URL中包含一些变量,但仍然有一条规则将其指向包含所有变量的丑陋URL?
一旦我写了.htaccess规则,我是否会返回并更改源代码中的链接以指向干净的URL?如果是这样,当干净的URL没有我要传递的所有变量时,如何使用GET方法执行此操作?
提前致谢,
约翰
答案 0 :(得分:3)
我不确定为什么你需要URL中的所有数据。您应该将提交标题,日期和作者之类的内容存储在数据库中,然后使用ID引用它。这样,您的网址就会更短更漂亮:
http://www.example.org/article.php?id=1
http://www.example.org/article/1/
您可以使用.htaccess
文件中的简单RewriteRule来完成此操作,如下所示:
RewriteEngine On
RewriteRule ^articles/([0-9]+)/ article.php?id=$1
答案 1 :(得分:0)
不,你不能把变量留出来并期望它们无论如何都要传递。如果您这样做,则信息不再出现在URL中,因此您无法获取该信息。
如果您希望传递变量而不显示变量,则可以使用post而不是get。
答案 2 :(得分:0)
我加入了Sjoerd的话,但是有很多方法可以像你想的那样重写你的网址!
Apache和(IIS)也支持这样的url-s:http://example.com/index.php/my-rewritten-url_62
function URISegment($segment)
{
$uri_array = explode('/',$_SERVER['REQUEST_URI']);
$uri_count = count($uri_array);
$returning_uri = array();
for($i = 0;$i<$uri_count;$i++)
{
if(empty($uri_array[$i]) || $uri_array[$i] == "index.php")
unset($uri_array[$i]);
else
array_push($returning_uri,$uri_array[$i]);
}
if($segment < count($returning_uri))
return $returning_uri[$segment];
else
return false;
}
这很有效,但你也需要定义基本网址,这需要在文件的开头调用,并在每个图像,脚本等调用时实现。
function BaseURL()
{
if(isset($_SERVER['HTTP_HOST']))
{
$base = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on' ? 'https' : 'http';
$base .= '://'. $_SERVER['HTTP_HOST'];
$base .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
}
else
{
$base = 'http://localhost/';
}
return $base;
}
在此之后你可以使用而不是:
// http://example.com/?MyKey=Some-data
$MyKey = $_GET['MyKey']; //which is the first item
echo $MyKey;
// results: Some-data
此:
// http://example.com/?MyKey=Some-data
$MyKey = URISegment(0);
echo $MyKey;
// results: Some-data
每个人都得到相同的结果。
PS:
我喜欢这个解决方案,因为我可以混合url类型,因为我需要它们:
example.com/index.php/index/evaled-article?some=db-stored&code=snipplet
当然你可以像FRKT一样重写你的网址:)
当然,如果你想隐藏index.php
你需要使用mod_rewrite,因为没有办法