Php Modrewrite未发送$\u GET参数

Php Modrewrite未发送$\u GET参数,php,.htaccess,url-rewriting,get,Php,.htaccess,Url Rewriting,Get,我正在尝试重写我的URL: RewriteEngine On RewriteBase / RewriteRule ^help/(.+)/(.+) help.php?helpid=$2 RewriteRule ^city/(.+)/(.+) city.php?cityid=$2 即使url包含预期的格式: 看来 isset($\u GET['helpid'])将始终在help.php中激发false 通常这个系统对我有效。这里有我遗漏的东西吗 -编辑- 正如我所看到的,这应该是可行的(或者至少

我正在尝试重写我的URL:

RewriteEngine On
RewriteBase /

RewriteRule ^help/(.+)/(.+) help.php?helpid=$2
RewriteRule ^city/(.+)/(.+) city.php?cityid=$2
即使url包含预期的格式:

看来

isset($\u GET['helpid'])
将始终在
help.php中激发
false

通常这个系统对我有效。这里有我遗漏的东西吗

-编辑-

正如我所看到的,这应该是可行的(或者至少你们中的一个答案),我正在为这个问题添加更多的代码:

完整的.htaccess内容

RewriteEngine On

ErrorDocument 500 /oohps.php
ErrorDocument 404 /oohps.php

RewriteCond %{HTTP_HOST} ^www.example.com [NC]
RewriteRule ^(.*)$ http://example.com/$1 [L,R=301]

RewriteBase /

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2 [QSA]
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2 [QSA]

RewriteRule ^login$ login.php
乞求帮助.php

session_start();
error_reporting(E_ALL);
ini_set('display_errors', '1');
$_GET['noseo'] = true;
include('htmlhead.php');
/* Leemos la id del grupo*/
$selected;
if(isset($_GET['helpid'])){
    $selected = $_GET['helpid'];
}else {
    echo '<script>alert("Modrewrite fails. Id is missing, id: '.$_GET['helpid'].'");location.href = "/"</script>';   /* Allways returns this*/
}
session_start();
错误报告(E_全部);
ini_集('display_errors','1');
$\u GET['noseo']=true;
包括('htmlhead.php');
/*格鲁波之家酒店*/
$selected;
如果(isset($\u GET['helpid'])){
$selected=$_GET['helpid'];
}否则{
echo'alert(“Modrewrite失败。缺少Id,Id:”。$\u GET['helpid']”;location.href=“/”;/*始终返回此消息*/
}

有两个变量的原因吗?不过,这是可行的:

RewriteEngine On
RewriteBase /    
RewriteRule ^help/([^/\.]+)/([^/\.]+)/?$ help.php?helpid=$2 [L]
RewriteRule ^city/([^/\.]+)/([^/\.]+)/?$ city.php?cityid=$2 [L]

使用
[QSA]
应该可以转发GET参数。另外,将
+
(贪婪)更改为
[^/]+
(表示任何不是斜杠重复1次或多次的字符),应该可以解决您的问题

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2 [QSA]
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2 [QSA]
也可以将其缩短为以下内容:

RewriteRule ^(help|city)/([^/]+)/([^/]+) $1.php?$1id=$3 [QSA]
:

当替换URI包含查询字符串时,RewriteRule的默认行为是丢弃现有查询字符串,并用新生成的查询字符串替换它。使用[QSA]标志会导致组合查询字符串

考虑以下规则:

重写规则/pages/(.+)/page.php?page=$1[QSA]

使用[QSA]标志,对/pages/123?one=two的请求将映射到/page.php?page=123&one=two。如果没有[QSA]标志,相同的请求将被映射到/page.php?page=123——也就是说,现有的查询字符串将被丢弃


正则表达式过于贪婪,第一个
+
也与斜杠匹配,导致正则表达式的其余部分失败。
[^/]+
正则表达式将匹配除斜杠以外的任何内容

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2

您可以在根目录中的.htaccess文件中尝试此操作:

Options+FollowSymlinks-多视图
重新启动发动机
重写基/
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写条件%{REQUEST_URI}^/([^/]+)/[^/]+/([^/]+)/?[北卡罗来纳州]
重写规则。*%1.php?%1id=%2[L]
重定向

http://domain.com/par1/anything/par2
带或不带尾随斜杠

http://domain.com/par1.php?par1id=par2

字符串
par1
anything
par2
被认为是动态的,根据问题中的示例,
par1
是PHP脚本的名称,也是重定向查询中
键的第一部分

par1
=帮助时的示例:

重定向:

http://domain.com/help/the-irelevant-title/5/

致:

http://domain.com/help.php?helpid=5

对于永久重定向,请将
[L]
替换为
[R=301,L]


虽然我没有测试其他规则,也不知道它们是否按预期工作,但问题中的.htaccess文件应按如下方式修改,以将规则集包含在此答案中:

Options+FollowSymlinks-多视图
重新启动发动机
ErrorDocument 500/oohps.php
ErrorDocument 404/oohps.php
重写cond%{HTTP_HOST}^www.domain.com[NC]
重写规则^(.*)$http://domain.com/$1[L,R=301]
重写基/
重写cond%{REQUEST_FILENAME}-F
重写cond%{REQUEST_FILENAME}-D
重写条件%{REQUEST_URI}^/([^/]+)/[^/]+/([^/]+)/?[北卡罗来纳州]
重写规则。*%1.php?%1id=%2[L]
#下一行是防止循环的建议添加。
重写cond%{REQUEST_URI}!登录\.php[NC]
重写规则^login$login.php[L]

是,第一个变量是到期SEO。我知道我只需要id,但是的,在这种情况下,我需要它为URL相关的关键字进行编辑,以满足您的需要。不过,其他人已经给出了基本相同的答案。不确定,在我这方面似乎没问题?更好的处理seo类型内容的方法是重写规则^help/([^/\.]+)/?$help.php?helpid=$2[L],然后通过/help/53这样的方式调用脚本-这是标题,然后分解-获取id或CakePHP之类的框架支持此NativeyQSA不适用,他的初始url似乎没有查询字符串。他试图从/help/foo/bar转到/help.php?helpid=bart。QSA标志用于将现有查询附加到重写的url,它会将/help/title/5/?param=1转换为help.php?helpid=5¶m=1。您不必处理查询。这很有用,但不是这里的正确答案。@SamDufel我现在意识到了这一点,并在你写答案之前更新了我的OP,以说明这只是供其他人在谷歌上搜索同一个问题。我喜欢这个“重写规则^(help | city)/([^/]+)/([^/]+)$1.php?$1id=$3[QSA]+1还可以使用非贪婪量词:
^help/(.+?)/(.+)
。请确保禁用多视图,否则Apache可能会在不使用mod_重写的情况下将/help/映射到help.php。实际上,只需添加“选项+FollowSymlinks-MultiViews”就可以解决问题。非常感谢!不客气。我认为这是缺少的,可能是问题的原因,但我还将这两条规则组合成了一条规则一个。也许那样做会更好,也更通用。