使用 .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 处理两个查询字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用 .htaccess 从 URL 末尾删除查询字符串

.htaccess 获取整个查询字符串到一个变量

查询字符串到htaccess中的路径有点工作?

使用 .htaccess 将查询字符串附加到 URL [关闭]

.htaccess 将查询字符串附加到内部重定向

301 通过 .htaccess 将查询字符串重定向到 SEO 友好的 URL