Php 检查URL重写代码

Php 检查URL重写代码,php,apache,.htaccess,mod-rewrite,Php,Apache,.htaccess,Mod Rewrite,我一直在编写这个URL重写.htaccess代码,但有些人说我做得不对或是倒退了: RewriteEngine On RewriteCond %{THE_REQUEST} /index\.php\?(.*)p=(?!admin)(?!superadmin)((?![^&]*?edit)[^\s&]+) [NC] RewriteCond %{THE_REQUEST} /index\.php\?(.*)p=([^&\ ]+)&?([^\ ]*) [NC] Rew

我一直在编写这个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]
最终,我希望用户不要看到带有查询字符串的链接,但我需要查询字符串仍然存在并以某种方式可用,以便我可以检查$\u GET变量的值

换句话说,我需要这个: -domain.com/index.php?p=要重写为domain.com/Home的Home -domain.com/index.php?p=Bio将被重写为domain.com/Bio -当用户单击主页上指向domain.com/index.php?p=Bio的链接时,他们应该会在浏览器的url栏中看到domain.com/Bio,但当我登陆Bio页面时,我仍然可以回显$_GET['p']和GET'Bio'

有道理吗


提前谢谢你的帮助

小的调整,它应该可以工作

Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} index\.php\?.*(?<!\w)p=(?![^&]*(?:admin|edit))([^\s&#]+) [NC]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/?$ index.php?p=%1 [L,QSA]
Options+FollowSymLinks-多视图
重新启动发动机
重写基/

重写cond%{u请求}索引\.php\*(?感谢您的回复-不幸的是,对于您的代码,我得到的只是一堆404错误。这是一个改进,如果您得到404,我们可以看到重写的url有什么问题。404表示该文件不存在,因此它找不到
index.php
…这怎么可能?请将
L
更改为
R
,片刻,它将重定向,因此在浏览器栏中,您将能够看到我们重定向到的url,并排除可能出现的错误。如果我在最后一行将L更改为R,它将简单地工作,就好像没有重写规则一样(换句话说,我看到所有带查询字符串的常规url)因此,这意味着它重定向到了正确的位置!非常好。现在,为了使重定向不可见,我们通常将
R
更改为
L
…但是你说
L
给你一个404。我想知道为什么!你有其他可能干扰的代码吗?你肯定使用了
Options+followymlinks-MultiViews
刚刚删除了我的缓存,打开了一个新的浏览器,删除了我.htaccess文件中的所有内容,并添加了您的全部代码…现在我没有得到404,但我也没有看到任何url重写发生,换句话说,我看到了带有查询字符串的旧链接。我理解您的要求,但您能否澄清第一个链接的目的或意图e> 重写代码中的cond%{THE_REQUEST}
行?@anubhava我的代码中的第一个条件是确保带有p=admin、p=superadmin和p=*******edit的地址不会被重写,而是在
p=
捕获之前的
(.*)
是什么。请用一两个例子加以说明。@anubhava说(.*)在我看来,p是不必要的,但它是由stackoverflow上的其他人作为建议添加给我的