htaccess将多查询字符串重写为路径

时间:2018-06-14 22:26:51

标签: php apache .htaccess mod-rewrite query-string

我将如何更改查询字符串

file.php?id=number&string=some-words

进入这个

file/number/some-words/

我知道这个问题已被问过一百万次了,但我在这里看了很多解决方案,它们都是基于单一查询的(就像在某些东西而不是什么东西?某些东西和其他东西)。 / p>

同样一旦重写,当使用$ _GET或$ _REQUEST等时,php仍然会读取原始页面查询字符串...即使它现在显示为路径吗?

感谢任何帮助。

感谢。

2 个答案:

答案 0 :(得分:2)

RewriteRule采用正则表达式,它可以像您想要的那样复杂,然后是将加载文件的真实URL。您将括号括在要在正则表达式中捕获的部分周围,并且可以引用第一组$1,第二组$2等,在URL部分中依此类推。例如:

RewriteRule ^(\w+)/(\d+)/(.*)$ index.php?file=$1&id=$2&words=$3

这将匹配3组:

  1. 字母/数字直到第一个斜杠
  2. 一些数字直到第二个斜杠
  3. 之后的任何内容,包括额外的斜杠
  4. $1$2$3可以引用这些内容,如第二部分所示,使用index.php。

    唯一的问题是,如果您缺少任何一个部分,规则中的模式将不匹配。因此,您需要为每个变体设置单独的规则:

    #matches all 3 parts
    RewriteRule ^(\w+)/(\d+)/(.*)$ index.php?file=$1&id=$2&words=$3
    #matches the first 2 parts
    RewriteRule ^(\w+)/(\d+)$ index.php?file=$1&id=$2
    #matches just the first part
    RewriteRule ^(\w+)$ index.php?file=$1
    #matches everything else
    RewriteRule ^.*$ index.php
    

    或者您可以执行通常称为bootstrapping的操作,您可以使用单个RewriteRule将所有内容重定向到单个php文件,如下所示:

    RewriteRule ^(.*)$ index.php
    

    然后你可以使用php来确定不同的部分是什么。在PHP内部有一个内置的服务器变量$_SERVER['REQUEST_URI'],它将为您提供URL的URI部分,它是域之后的所有内容和第一个斜杠,包括任何查询字符串参数。这基于用户请求的URL而不是apache重写的URL。您可以explode('/', $_SERVER['REQUEST_URI'])获取各个部分并随意使用它们。

答案 1 :(得分:1)

您可以将代码放在Apache .htaccess文件中。这看起来像这样:

(?<=joint=)(.*)(?=^)

或者你只能使用htaccess和php:

htaccess的

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^users/(\d+)*$ ./profile.php?id=$1
RewriteRule ^threads/(\d+)*$ ./thread.php?id=$1

RewriteRule ^search/(.*)$ ./search.php?query=$1

PHP

Options +FollowSymLinks
RewriteEngine On

RewriteCond %{SCRIPT_FILENAME} !-d
RewriteCond %{SCRIPT_FILENAME} !-f

RewriteRule ^.*$ ./index.php

它仍会读取原始页面查询字符串。

相关问题