Mod_rewrite没有发送$ _GET参数

时间:2013-02-22 20:06:40

标签: php .htaccess url-rewriting get

我正在尝试重写我的网址:

RewriteEngine On
RewriteBase /

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

即使该网址包含预期的格式:http://example.com/help/the-irelevant-title/5/

似乎

isset($_GET['helpid']))将始终在false

中触发help.php

通常这个系统对我有用。我在这里缺少什么吗?

- 编辑 -

我可以看到这应该有效(或者至少有一个人回答)我在这个问题中添加了更多代码:

完整.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

开始使用help.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*/
}

4 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

使用[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]

From the apache manual

  

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

     

考虑以下规则:

     

RewriteRule /pages/(.+)/page.php?page=$1 [QSA]

     

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

答案 2 :(得分:1)

你有两个变量的原因吗?这虽然有效:

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

答案 3 :(得分:1)

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

Options +FollowSymlinks -MultiViews
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  ^/([^/]+)/[^/]+/([^/]+)/?  [NC]
RewriteRule .*              %1.php?%1id=%2             [L]

重定向

带有或不带斜线的

http://domain.com/par1/anything/par2

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

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

par1 = 帮助时的示例:

重定向:

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

致:

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

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


虽然我没有测试其他规则并且不知道它们是否按预期工作,但问题中的.htaccess文件应该像这样修改以包含此答案中的规则集:

Options +FollowSymlinks -MultiViews
RewriteEngine On
ErrorDocument 500 /oohps.php
ErrorDocument 404 /oohps.php

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

RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI}  ^/([^/]+)/[^/]+/([^/]+)/?  [NC]
RewriteRule .*              %1.php?%1id=%2             [L]

# Next line is a suggested addition to prevent loops.
RewriteCond %{REQUEST_URI}  !login\.php [NC]
RewriteRule ^login$   login.php         [L]