到目前为止,我将所有内容都包含在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的页面添加重写规则?或者有更好的方法吗?
我希望我不必为所有页面都这样做。
答案 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”)作为处理程序的参数。
答案 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);