2

我为我的网站开发了一个小型的自定义 MVC 框架。它是 index.php 检查 $_POST['page'] & $_POST['subpage'] 并包含指定参数的相关 php 文件。

例如:index.php?page=foods (这包括 view/foods.php)

例如:index.php?page=foods&subpage=pizza (这包括 view/foods/pizza.php)

现在我想使用 .htaccess 清理我的 URL。我尝试了几种方法来传递第二个参数。但我失败了。这工作正常...

RewriteEngine on
RewriteRule ^([^/\.]+)?$ index.php?page=$1 [L]

但是当我试图传递第二个参数时它不能正常工作。这一更改 css/js/iamges 路径。

RewriteEngine on
RewriteRule ^([^/\.]+)?$ index.php?page=$1

RewriteRule ^([^/\.]+)/([^/\.]+)?$ index.php?page=$1&sub=$2
4

3 回答 3

2

如果您使用 QSA(查询字符串附加)标志,您可以简单地将整个请求字符串传递给索引文件 -

QSA - 将原始请求 URL 中的任何查询字符串附加到在重写目标中创建的任何查询字符串

所以你的规则看起来类似于这个 -

RewriteRule %{REQUEST_FILENAME} !-d
RewriteRule %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]

在您的索引文件中,您可以.explode()使用斜杠 -

$splitArr = explode('/',$_GET['uri']);

和/或使用内置parse_url()函数 - http://www.php.net/manual/en/function.parse-url.php

parse_url— 解析 URL 并返回其组件

于 2012-07-23T17:12:20.230 回答
2

大多数这种类型的 url-rewriters 明确排除实际存在的文件/目录:

RewriteRule %{REQUEST_FILENAME} !-d
RewriteRule %{REQUEST_FILENAME} !-f
于 2012-07-23T17:14:56.383 回答
0
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f [OR]
RewriteRule ^public/(js|css|images)(/.*|$) - [L]
RewriteRule ^(.+)$ index.php?page=$1 [QSA,L]

这就是我终于做到了!

于 2012-07-23T20:13:33.990 回答