如何为我的网站制作友好的网址?

时间:2009-01-30 17:13:31

标签: apache mod-rewrite

到目前为止,我将所有内容都包含在index.php中:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?page=$1 [QSA,L]

还有一些我使用$ _GET的页面:

SELECT * FROM news WHERE id = ".intval($_GET['id'])

如果我要查看新闻,请输入news?id=1 而不是?page=news&id=1,但我希望能够使用news/1

我是否必须为每个使用GET的页面添加重写规则?或者有更好的方法吗?

我希望我不必为所有页面都这样做。

4 个答案:

答案 0 :(得分:5)

RewriteRule ^([^/]*)/?([^/]*)$ index.php?page=$1&id=$2 [QSA,L]

应允许您的网页输入为www.example.com/page/id

您的大多数网页内部都会显示为www.example.com/index.php?page=text&id=,但这不会影响任何内容。

答案 1 :(得分:2)

这个单一规则应该允许有和没有id(并且还使斜杠可选):

RewriteRule ^([^/]*)(/([^/]*)/?)?$ index.php?page=$1&id=$3 [QSA,L]

如果您不想允许/和//,请将*更改为+

答案 2 :(得分:0)

只需使用news / 1,它将与您当前的重写规则一起使用,并将该值放入page参数中。然后在index.php中创建一个通用的URL调度程序,它将页面参数的值解析为组件片段,并根据这些片段决定要做什么。

例如,一个非常简单的通用调度程序只是将页面参数拆分为“/”,然后根据从拆分返回的第一个项的值调用处理程序(例如“news”),通过其余部分碎片(例如“1”)作为处理程序的参数。

编辑:语法和link to tutorials on URL dispatching in PHP

答案 3 :(得分:0)

试试这条规则:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)$ index.php?page=$1 [QSA,L]
RewriteRule ^([^/]+)/(\d+)$ index.php?page=$1&id=$2 [QSA,L]

或者您可以使用PHP解析所请求的路径:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule !^index\.php$ index.php [QSA,L]


// remove the query string from the request URI
$_SERVER['REQUEST_URI_PATH'] = preg_replace('/\?.*/', $_SERVER['REQUEST_URI']);
// removes leading and trailing slashes and explodes the path
$segments = explode('/', trim($_SERVER['REQUEST_URI_PATH'], '/'));
var_dump($segments);