我想让我的网址更加友好,例如改变它:
这样的好事:
http://www.chillisource.co.uk/product/Daves_Gourmet/Daves_Insanity_Sauce
这样做的最佳方式是什么?我已经看过用htaccess文件做这个,但这看起来很复杂。
提前致谢
答案 0 :(得分:2)
Ben Paton,实际上有一个非常简单的方法。像Wordpress这样的CMS倾向于使用它而不是乱用正则表达式。
.htaccess
方首先,使用带有以下内容的.htacess:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
让我解释它的作用(逐行):
RewriteBase
/subdir/
)以上只是一个简单的解释。你真的不需要它来使用它。
我们做了什么,是我们告诉Apache所有最终都是404的请求将它们传递给index.php文件,我们可以手动处理请求。
在PHP端,在index.php
内,您只需要解析原始URL。此网址在$_SERVER
变量中传递为$_SERVER['REDIRECT_URL']
。
最好的部分,如果没有重定向,则不设置此变量!
因此,我们的代码最终会像:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
switch($url[0]){
case 'home': // eg: /home/
break;
case 'about': // eg: /about/
break;
case 'images': // eg: /images/
switch( $url[1] ){
case '2010': // eg: /images/2010/
break;
case '2011': // eg: /images/2011/
break;
}
break;
}
}
我几乎忘记提及这一点了,但是,由于它的工作方式,你甚至可以根本不改变你现有的代码!
少说话,多举例。假设你的代码看起来像:
<?php
$page = get_page($_GET['id']);
echo '<h1>'. $page->title .'</h1>';
echo '<div>'. $page->content .'</div>';
?>
与网址合作:
index.php?id=5
您可以将其与SEO URL一起使用,同时将其与旧系统保持一致。首先,确保.htaccess
包含我在上面编写的代码。
接下来,在文件的最开头添加以下代码:
if ( isset( $_SERVER['REDIRECT_URL'] ) ) {
$url = explode('/', $_SERVER['REDIRECT_URL'] );
$_GET['id'] = $url[0];
}
我们在这做什么?在继续使用两个自己的代码之前,我们基本上是从旧URL中查找ID和信息,并将其提供给PHP的$ _GET变量。 我们基本上是在愚弄你的代码,认为请求有这些变量!
找到所有那些令人讨厌的<a/>
标签并相应更换href
的唯一障碍,但这是一个不同的故事。 :)强>
答案 1 :(得分:1)
它叫做mod_rewrite,这是一个教程:
答案 2 :(得分:0)
使用PATH_INFO
环境变量怎么样?
$path=explode("/",getenv("PATH_INFO"));
echo($path[0]."; ".$path[1] /* ... */);
将输出
product; Daves_Gourmet; Daves_insanity_Sauce
从使用$_GET
到使用PATH_INFO
环境的过渡是一个很好的编程练习。我认为你不能只通过配置完成任务。
答案 3 :(得分:0)
尝试这样的事情
RewriteRule ^/([a-zA-Z0-9]+)/([a-zA-Z0-9]+)/([a-zA-Z0-9]+) /$1.php?id1=$2&id2=$3 [QSA]
然后使用$_GET
获取参数值...
答案 4 :(得分:0)
我必须添加:在原始网址中,有一个'prod'键,它似乎包含一个ID。 确保在切换到重写的网址时,您不再仅仅依赖于唯一ID,因为这在网址中不可见。 现在,您可以使用ID来区分具有相同名称的2个产品,但是如果要重写URL并且不再需要URL中的ID,则需要确保1个产品名称不能多次用于不同产品。 同样,我看到'cat'-key不存在于所需的输出URL中,同样适用于上述。
忽略上述“问题”,重写应该看起来像:
RewriteRule ^/product/(.*?)/(.*?)$ /product?&cat=Grocery&q=$1&page=1&prod=B0000DID5R&prodName=$2
q&amp; prodName将收到强调的值,而不是%20,因此还需要一些修补。 正如你所看到的,我没有触及id&amp;类别,由你决定如何处理它。