使用重写规则在$ _GET上保留问号

时间:2017-07-11 08:50:48

标签: php apache .htaccess mod-rewrite url-rewriting

因此,在使用重写规则后,我发现this interesting question使问号符号出现在$ _GET变量上。

然而,尽管我自己试图完成此任务,但我并不完全明白如何在我的网站上获得相同的结果。

这是我的重写规则:

RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]

这基本上允许我将用户路由到特定的地方,而无需对我的htaccess文件上的每个页面进行硬编码,因此如果用户进入/ about / contact页面,他实际上将转到index.php?uri = /约/接触。

问题是有时候我想把问号保存在$ _GET中。让我们来说一个主题标题是"什么了?"然后我的网址会搜索/ topic / what-s-up这样的话题?并且会与什么东西相匹配?在数据库中。但是,现在,我的$ _GET变量只存储" what-s-up" (没有"?")我的数据库仍然存储" what-s-up?" (使用"?"),这可能会说实际上没有该标题的主题。

我如何保留问号/ topic / what-s-up?仍然翻译成/ topic / what-s-up?在查询字符串?

编辑:完整。用于测试用途的高级文件

Options -Indexes

DirectoryIndex index.html index.php

RewriteEngine On

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.+)$ index.php?uri=$1 [QSA,L]

2 个答案:

答案 0 :(得分:2)

您可以将规则更改为此选项以捕获?参数中的可选uri

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{THE_REQUEST} \s/+([^?]*\??\S*)\sHTTP [NC]
RewriteRule ^(.+)$ index.php?uri=%1 [QSA,L]

由于我们还希望捕获?,因此我们使用RewriteCond %{THE_REQUEST},因为RewriteRule中的模式仅匹配REQUEST_URI。由于我们从RewriteCond获取了价值,因此我们使用%1代替$1作为反向引用。

THE_REQUEST变量表示Apache从您的浏览器收到的完整原始请求,并且在执行某些重写规则后不会被覆盖。此变量的示例值为GET /index.php?id=123 HTTP/1.1

答案 1 :(得分:-1)

我知道它晚了,但是我使用php urlencode()来传递问号,因为它可以转换?到%3F