【发布时间】:2014-07-22 04:01:30
【问题描述】:
我一直在处理这个 URL 重写 .htaccess 代码,但有人说我做错了或倒退了:
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]
最终我希望用户不要看到带有查询字符串的链接,但我需要查询字符串仍然存在并且以某种方式可用,以便我可以检查 $_GET 变量的值。
换句话说,我需要这个: - domain.com/index.php?p=Home 改写为 domain.com/Home - domain.com/index.php?p=Bio 被重写为 domain.com/Bio - 当用户从主页单击指向 domain.com/index.php?p=Bio 的链接时,他们应该在浏览器的 url 栏中看到 domain.com/Bio,但我仍然应该能够回显 $_GET[' p'] 并在我登陆 Bio 页面时获取“Bio”。
有意义吗?
提前感谢您的帮助!
【问题讨论】:
-
我了解您的要求,但您能否说明代码中第一行
RewriteCond %{THE_REQUEST}的目的或意图是什么? -
@anubhava 我代码中的第一个条件是确保不会重写 p=admin、p=superadmin 和 p=*******edit 的地址
-
好的,但是
(.*)在p=捕获之前是什么。请用一两个例子来说明。 -
@anubhava 在我看来 p 之前的 (.*) 是不必要的,但它是由 stackoverflow 上的其他人作为建议添加给我的
标签: php apache .htaccess mod-rewrite