使用 .htaccess 处理两个查询字符串
Posted
技术标签:
【中文标题】使用 .htaccess 处理两个查询字符串【英文标题】:Handling Two Query Strings with .htaccess 【发布时间】:2012-11-06 12:59:56 【问题描述】:我正在尝试为具有两个查询字符串参数的页面重写 url。并根据这些参数值(设置与否),在页面上显示不同的内容。
example.com/fotograf.php?aid=10
example.com/fotograf.php?aid=10&fid=5
上面的 URL 是未重写的示例。我只是想让它们这样
example.com/fotograf/10/
example.com/fotograf/10/5/
第一个 URL 链接到包含照片的相册,第二个 URL 链接到该相册中的照片。
在.htaccess
中,我只是希望能够使用上面的干净 URL 来联系他们。之后,我将检查脚本顶部的 URL,如果它不干净,那么使用我编写的函数将其重定向到干净的 URL(通过使用 preg_match 和 preg_split 获取值并使用 header 函数重定向)。
到目前为止,我已经尝试过这个规则(无法查看相册):
RewriteRule ^fotograf/([0-9-/]+)/([0-9]+)/?$ fotograf.php?aid=$1&fid=$2 [L]
然后,这个(总是重定向到相册):
RewriteRule ^fotograf/([0-9-/]+)/?$ fotograf.php?aid=$1 [L]
最后,这个(帮助我通过example.com/fotograf/10/?fid=5
之类的网址查看照片):
RewriteCond %QUERY_STRING ^fid=(.*)$
RewriteRule ^fotograf/(.*)/$ fotograf.php?aid=$1&fid=%1
但我不想在 URL 中看到任何问号或 & 符号。
不知何故,我需要检查哪些是(已)设置并相应地重定向,但我只是不知道如何实现这一点。
我该怎么做?
提前致谢。
【问题讨论】:
【参考方案1】:您需要让您的应用程序生成您想要的 URL,所以格式如下:
example.com/fotograf/10/
example.com/fotograf/10/5/
并且遵循重写规则将确保它会到达您的 php:
RewriteEngine On
RewriteRule ^fotograf/([0-9]+)/([0-9]+)/?$ fotograf.php?aid=$1&fid=$2
RewriteRule ^fotograf/([0-9]+)/?$ fotograf.php?aid=$1
mod_rewrite
无法在您的 html 页面中重写 URL...
【讨论】:
实际上,我一定已经尝试过您的建议,但我认为这是相反的顺序,这可能会改变代码的行为。现在它正在工作!我通过一个函数在每个页面的顶部生成这些 URL,在该函数中我首先识别查询字符串,然后拆分它们并获取它们的值以生成干净的版本。最后使用 header 函数,我重定向到新的干净 URL,而不在页面上打印任何内容。我不知道我的方法是否有效,但我无法在 .htaccess 中做到这一点,我不得不用 PHP 来处理它。非常感谢@Kamil Šrot @Gungor 你的方法很好。 “不干净”的 URL 从何而来?您也可以尝试完全摆脱它们 出于测试目的,我仍然将它们保留在页面中,尤其是在菜单中。当我确定我做的正确时,我会将它们全部更改为干净的。【参考方案2】:# this works
RewriteEngine On
RewriteBase /yourdir/yourfolder/
# only 1 in root
# RewriteRule ^([a-zA-Z0-9-]+)$ index.php?act=$1[L,QSA]
RewriteRule ^([a-zA-Z0-9-]+)/([a-zA-Z0-9-]+)/?$ members.php?act=$1&opts=$2
RewriteRule ^([a-zA-Z0-9-]+)/?$ members.php?act=$1
# Your url would be:
# example of http://localhost/yourdir/yourfolder/members.php?act=beer
# http://localhost/yourdir/yourfolder/beer
# or
# http://localhost/yourdir/yourfolder/members.php?act=beer&ops=morebeer
# http://localhost/yourdir/yourfolder/beer/morebeer
【讨论】:
以上是关于使用 .htaccess 处理两个查询字符串的主要内容,如果未能解决你的问题,请参考以下文章