请帮我编辑我的.htaccess以允许网址中的连字符

时间:2011-04-07 15:01:54

标签: php variables

更新

在我的原帖中,我似乎隐含了我的变量名称有一个连字符。我的问题似乎是下面的htaccess文件不能在连字符上匹配,但我的$ _GET变量内容有一个连字符,而不是变量本身。

原始

我最初引用http://php.net/manual/en/language.variables.variable.php,用户声称不可能用连字符引用php变量($ _POST或$ _GET),但这是在2009年写的。

在我的一个URL中,我允许用户输入一个唯一的ID作为“www.site.com/id123”,其中“id123”被选为带有php的$ _GET变量。有些用户选择使用“www.site.com/id-123”,但无效(除了页面之外没有服务器错误)。

有关于此的任何想法吗?

的.htaccess

RewriteEngine On

#if file or directory do not exist, try as an unique id
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}.php !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^([0-9a-zA-Z]+)$ index?ID=$1 [QSA,NC,L]

RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.*)$ $1.php [QSA,L]

通过更多思考,上面的重写规则似乎可能需要修改才能处理连字符请求。这看起来是对的吗?

7 个答案:

答案 0 :(得分:14)

您的.htaccess文件需要修改才能支持连字符。

更改

RewriteRule ^([0-9a-zA-Z]+)$ index?ID=$1 [QSA,NC,L]

RewriteRule ^([0-9a-zA-Z-]+)$ index?ID=$1 [QSA,NC,L]

答案 1 :(得分:5)

字符串的内容可能包含连字符。变量的名称可能不会。

在您的问题中,不清楚HTTP查询字符串的位置。 $_GET['some-variable']很好,因为数组键是一个字符串。 $my-var不合适。

如果您的网页请求无效,则.htaccess文件更有可能出现问题。

答案 2 :(得分:1)

不,这是不可能的

变量名以字母或下划线开头,可选地后跟数字,字母或下划线。 http://www.php.net/manual/en/language.variables.basics.php

对于关联数组键,您可以使用任何字符串;由于字符串允许包含连字符,因此您可以使用$_GET['user-id'];

答案 3 :(得分:1)

理论上,you cannot

  

变量名称遵循相同的规则   作为PHP中的其他标签。一个有效的   变量名以字母或开头   下划线,后跟任意数量的   字母,数字或下划线。

在实践中,好吧......

<?php

${'widh-hyphen'} = 'This variable has a pyphen';
${'Variable with funny name. Woot!'} = 'And this is even worse!';
var_dump(${'widh-hyphen'}, ${'Variable with funny name. Woot!'});

?>

...打印:

string(26) "This variable has a pyphen"
string(23) "And this is even worse!"

所以我说你可以。

但是,这些内容都不适用于GET和POST输入数据。由于应始终禁用Register Globals,因此您的参数将成为$_GET$_POST关联数组的键和other rules apply

  

键可以是整数,也可以是   串。如果一把钥匙是标准   表示整数,它会   被解释为这样(即“8”将   被解释为8,而“08”将被解释为   被解释为“08”)。浮在钥匙上   被截断为整数。索引   和关联数组类型是   PHP中的相同类型,两者都可以   包含整数和字符串索引。

在这种情况下,您必须仅考虑dots are converted to underscores出于历史原因:

  

变量名中的点和空格是   转换为下划线。例如    变   $ _REQUEST [ “A_B”]。

答案 4 :(得分:0)

正如汤姆所说,你可以在字符串中使用连字符,所以$ _GET [user] ='id-123'不会给你任何问题,也不会发送任何数据,如get.php?user = id-123

我假设您的.htaccess会将www.site.com//id-123重写为/getuser.php?user=id-123 如果是这样,你应该没有问题。

但如果您正在尝试,出于某种原因创建$ id-123,那么您将遇到一些问题..

答案 5 :(得分:0)

一个可以使用替代语法来表示古怪的变量名称:

${'my-var'} = 123;

但正如其他答案所说,这与你的案件完全无关。你不需要它。由于您以数值形式接收数据,因此您甚至不需要遵守$ _GET变量名称转换。

您的案例中的问题(找不到网页)听起来像RewriteRule问题。检查它的正则表达式中是否包含连字符:

RewriteRule  ^([\w+\-]+)$  get.php?id=$1

                #  ^^  missing

答案 6 :(得分:0)

实际上是的,变量可以有你想要的任何名字。您只需要以其他方式访问它们。

这有效:

$foo = "id-123"; 
$$foo = "hello";
var_dump($$ffoo);

您可以通过添加var_dump($GLOBALS);来检查这一点,var_dump($id-123);将显示名为“id-123”的变量。

但是,您无法以正常方式访问此类变量:$_GET["id-123"]将无效。

但是,因为你在谈论GET / POST变量:这些只是标准的数组键,它们也可以有任何名称,因为你通过数组访问它们:www.site.com/id123

但请注意,您的示例{{1}}表示PATH_INFO,通常与$ _GET或$ _POST无关。