2011-01-12 37 views
4



我正在设计我的应用程序。我应该做下一件事。所有GET参数(?var = value)在mod_rewrite的帮助下应该转换为/ var/value。我怎样才能做到这一点?我只有1个.php文件(index.php),因为我正在使用FrontController模式。你能帮我用这个mod_rewrite规则吗?

对不起,我的英语。先谢谢你。PHP的所有GET参数与mod_rewrite

+4

这听起来对您和您的用户都很可怕。通常,使路径看起来像指定内容是个不错的主意,但只保留其他参数。例如,您可能不是/content.php?id=5,而是/ content/5。如果你有一些选择的东西,但你可能想要做一些像/ content/5?opt1 = something&opt2 = something。 – Brad 2011-01-12 21:06:28

回答

6

我在使用'seo-friendly'网址的网站上做这样的事情。

在.htaccess:

Options +FollowSymLinks 
RewriteEngine on 
RewriteCond %{REQUEST_FILENAME} !-f 
RewriteCond %{REQUEST_FILENAME} !-d 
RewriteRule .* /index.php [L] 

然后在index.php文件:

if ($_SERVER['REQUEST_URI']=="/home") { 
    include ("home.php"); 
} 

的的.htaccess规则告诉它加载的index.php,如果要求的文件或目录未找到。然后你只需解析请求URI来决定index.php应该做什么。

+0

美丽。这正是我需要的。 – Qix 2013-05-01 16:09:27

1

AFAIK mod_rewrite在问号后不处理参数 - 重写规则的regexp行结束符与'?'之前的路径末尾相匹配。所以,你几乎不能传递参数,或者在重写时完全放弃参数。

3

的.htaccess

RewriteEngine On 

# generic: ?var=value 
# you can retrieve /something by looking at $_GET['something'] 
RewriteRule ^(.+)$ /?var=$1 

# but depending on your current links, you might 
# need to map everything out. Examples: 

# /users/1 
# to: ?p=users&userId=1 
RewriteRule ^users/([0-9]+)$ /?p=users&userId=$1 

# /articles/123/asc 
# to: ?p=articles&show=123&sort=asc 
RewriteRule ^articles/([0-9]+)/(asc|desc)$ /?p=articles&show=$1&sort=$2 

# you can add /? at the end to make a trailing slash work as well: 
# /something or /something/ 
# to: ?var=something 
RewriteRule ^(.+)/?$ /?var=$1

第一部分是接收到的URL。第二部分重写的URL,您可以使用$_GET读出。 ()之间的所有内容都被视为一个变量。第一个将是$1,第二个是$2。这样,您就可以确定变量在重写的URL中的确切位置,从而知道如何检索它们。

通过使用(.+),您可以保持一般性并允许“一切”。这仅仅意味着:任何字符的一个或多个(+)(.)。或者更具体而且例如仅允许数字:[0-9]+(0到9范围内的一个或多个字符)。你可以在http://www.regular-expressions.info/找到更多有关正则表达式的信息。这是一个很好的网站来测试它们:http://gskinner.com/RegExr/

5

您的.htaccess中的以下代码将重写您的URL从例如。 /api?other=parameters&added=true/?api=true&other=parameters&added=true

RewriteRule ^api/   /index.php?api=true&%{QUERY_STRING} [L] 
+0

这就是我正在寻找的!谢谢! – Aaron 2013-04-13 21:13:37