如何访问和使用已重写的URL的查询字符串

时间:2014-07-21 20:30:11

标签: php .htaccess url-rewriting

我正在开发一个脚本,该脚本严重依赖于从URL中读取变量来确定要执行的操作和要显示的内容。 为了使其更加SEO友好,我已将以下URL重写添加到根目录中的.htaccess文件中:

RewriteEngine On

RewriteCond %{THE_REQUEST} /index\.php\?p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]

RewriteCond %{THE_REQUEST} /index\.php\?p=([^\s&]+) [NC]
RewriteRule ^ /%1? [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]

这会从浏览器的地址栏中完全删除查询字符串,但是脚本中的很多内容不再起作用,因为变量$ _GET [' var']现在为空...

有没有办法我仍然可以读取URL中发送的变量的内容?

由于

3 个答案:

答案 0 :(得分:1)

您正在向后重写。用户应转到page/var1val/var2val/,然后重写(在后端)page.php?var1=var1val&var2=var2val。如果您从第二个网址开始并重写为第一个网址,那就错了。

也就是说,换句话说:用户应该转到一个漂亮的网址,然后在后端将其转换为带有?和参数名称的oldschool网址。

如果用户使用带有?的oldschool网址并且其中包含参数名称,并且您只是将其剥离,那么就无法正常工作。

答案 1 :(得分:1)

尝试:

RewriteEngine On

RewriteCond %{THE_REQUEST} /index\.php\?(.*)p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC]
RewriteCond %{THE_REQUEST} /index\.php\?(.*)p=([^&\ ]+)&?([^\   ]*) [NC]
RewriteRule ^ /%2?%1%3 [R=301,L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=$1 [L,QSA]

答案 2 :(得分:0)

看起来查询字符串将在$_GET['p']中。尝试:

parse_str($_GET['p'], $_GET);

或者也许:

parse_str(urldecode($_GET['p']), $_GET);

这将覆盖当前的$_GET。如果需要,请使用另一个var。