0

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

RewriteEngine On
RewriteBase /

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

甚至该 url 包含预期的格式: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

4 回答 4

3

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

RewriteRule ^help/([^/]+)/([^/]+) help.php?helpid=$2
RewriteRule ^city/([^/]+)/([^/]+) city.php?cityid=$2
于 2013-02-22T20:10:22.953 回答
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]

从 apache 手册

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

考虑以下规则:

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

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

于 2013-02-22T20:09:06.937 回答
1

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

RewriteEngine On
RewriteBase /    
RewriteRule ^help/([^/\.]+)/([^/\.]+)/?$ help.php?helpid=$2 [L]
RewriteRule ^city/([^/\.]+)/([^/\.]+)/?$ city.php?cityid=$2 [L]
于 2013-02-22T20:08:26.813 回答
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

Stringspar1和假定是动态的anythingpar2根据问题中的示例, 它是 PHP 脚本的名称,也是重定向查询中名称par1的第一部分。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]
于 2013-02-25T05:02:32.713 回答