在窗体参数上使用mod_rewrite
在网站上使用mod_rewrite非常简单,并且可以创建一些漂亮的URL结构。而不是像这样包含很多奇怪参数的URL:
http://www.example.com/example.php?parameter1=value1¶meter2=value2
您可以使用.htaccess文件在服务器端重写URL,以将其缩短为以下形式:
http://www.example.com/p-value1
在这种情况下,parameter2的值将始终为value2,因此我们可以将其包括在重写规则中,如下所示。$1是对RewriteRule中匹配的第一个括号值的反向引用。
RewriteRule^p-(.*)$/example.php?parameter1=$1¶meter2=value2[L]
切记在启动重写规则之前,请确保已启用FollowSynLinks指令并已打开重写引擎。您的服务器管理员应已启用FollowSynLinks,但是如果没有,您可以在此包括它们。
Options +FollowSymLinks RewriteEngine On
您还可以通过将所有这些都包含在if语句中来确保确实安装了mod_rewrite。如果您没有mod_rewrite,这将阻止服务器抛出错误。
Options +FollowSymLinks RewriteEngine On
PHP在服务器端看到的内容与普通的完全相同,因此您可以使用标准的$_GET查找来检索参数。
但是,表单的默认行为将其弄乱了。假设我们有一个搜索页面,我们创建了一个重写规则,因此它的内容如下:
http://www.example.com/s-value1
这将重定向到该页面search.php,并将任何参数传递到该页面。这里的问题是,如果我们通过表单调用同一页面。这是示例搜索表单。
当使用字符串“test”运行时,URL看起来像这样。
search.php?q=test&s=Search
这是默认的浏览器行为,但仍会弄乱以前创建的URL结构。有一种方法可以解决此问题。看看下面的.htaccess文件。
Options +FollowSymLinks RewriteEngine On RewriteCond %{REQUEST_URI} /search.php$ RewriteCond %{QUERY_STRING} ^q=([A-Za-z0-9\+]+)&s=Search$ RewriteRule ^(.*)$ /s-%1? [R=301,L] RewriteRule ^s-(.*)$ /search.php?q=$1&s=Search&a=1 [L]
在这里,我们使用RewriteCond指令,该指令允许我们测试某些条件。在这种情况下,我们有两个条件。
RewriteCond %{REQUEST_URI} /search.php$ RewriteCond %{QUERY_STRING} ^q=([A-Za-z0-9\+]+)&s=Search$
第一个条件允许我们仅在页面search.php上运行规则。如果我们想将相似的查询字符串传递到另一个页面,这将消除任何令人烦恼的混乱。第二个条件允许我们测试查询字符串,以查看它是否包含我们要查找的参数。在%{QUERY_STRING}位是在一开始就通过实际的查询字符串的引用,减去问号。在这种情况下,我们要使用任何值捕获参数q并使用Search值捕获参数s。最后的美元符号非常重要,但我将回到这一点。
第一条重写规则将页面重定向search.php到URL/s-以及任何查询字符串。%1是对最近匹配的RewriteCond中匹配的第一个括号值的反向引用。
RewriteRule^(.*)$/s-%1?[R=301,L]
然后,我们还需要包含一个重写规则,该规则将识别新URL并对其进行操作。但是,我们不希望做的就是混淆服务器并将其置于无限循环中,这很容易,因为我们正从重定向search.php到search.php。因此,我们要做的是在重写规则的末尾包含参数“a”,其值为1。
RewriteRule^s-(.*)$/search.php?q=$1&s=Search&a=1[L]
回到上面的第二个重写条件,我们在规则末尾添加了一个美元符号。这意味着字符串必须在此处结束,因此,如果我们在查询字符串的末尾包含其他内容,则重写条件将返回false。因此,尽管我们实际上并未在脚本中使用a,但仍需要在其中停止服务器进入重定向的无限循环。
有关mod_rewrite和其他.htaccess示例的更多信息,请参见AskApache上的出色教程。