我正在开发一个脚本,该脚本严重依赖于从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中发送的变量的内容?
由于
答案 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。