Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从.htaccess重定向中了解int值_Php_.htaccess - Fatal编程技术网

Php 从.htaccess重定向中了解int值

Php 从.htaccess重定向中了解int值,php,.htaccess,Php,.htaccess,我有一个档案系统。我将example.com/player/?id=1重定向设置为example.com/player/1,我想知道重定向后如何知道其用户id号1?而不是我的网站去404对我来说 .htaccess # Make bloxplays.com/profile/?id=1 to bloxplays.com/profile/1 RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /player/([^\?]*)\?id=([^&\ ]+)([^\ ]

我有一个档案系统。我将example.com/player/?id=1重定向设置为example.com/player/1,我想知道重定向后如何知道其用户id号1?而不是我的网站去404对我来说

.htaccess

# Make bloxplays.com/profile/?id=1 to bloxplays.com/profile/1
RewriteCond %{THE_REQUEST} ^(GET|HEAD)\ /player/([^\?]*)\?id=([^&\ ]+)([^\ ]*)
RewriteRule ^ /player/%3/%2?%4 [L,R=301]

这可能就是您正在寻找的:

RewriteEngine on

# externally redirect profile/index.php?id=1 to /profile/1
RewriteCond %{QUERY_STRING} (?:^|&)id=(\d+)(?:&|$)
RewriteRule ^/?player/?$ /player/%1 [R=301,END]

# internally rewrite /profile/1 to profile/index.php?id=1
RewriteRule ^/?player/(\d+)/?$ /player/id=$1 [QSA,END]
然后,您可以像往常一样,从php的超全局变量中获取实际的数值
id
,因此在本例中,
$\u get['id']

这假设对
/player/
的请求以某种方式映射到设置中的处理php脚本。你的问题表明情况就是这样,这就是为什么我没有进一步阐述这一点

根据您的实际应用程序逻辑(它发送或生成的引用),您不需要首先重定向。但您肯定需要将传入的请求重写为php能够处理的内容。您的应用程序逻辑绝对应该只使用
/player/1
形式的引用,第一次重定向仅适用于在某个地方打上书签的旧引用,或者如果您的应用程序逻辑的某些部分尚未修复以使用新的引用模式

一开始使用302临时重定向是一个好主意,在确定所有设置都正确后,只需将其更改为301永久重定向。这样可以防止在尝试时出现缓存问题

如果您使用上述规则收到一个内部服务器错误(http状态500),那么很可能您操作的是非常旧版本的apache http服务器。在这种情况下,您将在http服务器错误日志文件中看到不支持的
[END]
标志的明确提示。您可以尝试升级或使用较旧的
[L]
标志,在这种情况下可能也会使用相同的标志,不过这取决于您的设置

此实现将在http服务器主机配置或分布式配置文件(“.htaccess”文件)中同样工作。显然,重写模块需要在http服务器中加载,并在http主机中启用。如果使用分布式配置文件,则需要注意在主机配置中启用该文件的解释,并且该文件位于主机的文档根文件夹中


还有一个一般性的注释:您应该总是更喜欢将这些规则放在http服务器主机配置中,而不是使用分布式配置文件(“.htaccess”)。这些分布式配置文件增加了复杂性,通常是导致意外行为的原因,难以调试,而且它们确实降低了http服务器的速度。只有在您无法访问真正的http服务器主机配置的情况下(阅读:真正廉价的服务提供商),或者在应用程序坚持编写自己的规则(这显然是一个安全噩梦)时,才提供它们作为最后选项。

我想您误解了URL重写。对于友好的URL,实际上需要将
/profile/1
重写为
profile/index.php?id=1
。我们的想法是采用一个友好的URL,并以应用程序(PHP脚本)可以解释的方式(在内部)重写它。哦,不,我将profile/index.PHP?var=arg重写为profile/arg,我想知道我该如何知道arg是什么?您还需要实现另一个方向。当一些客户端请求
/profile/arg
时,您需要在内部将其重写为
profile/index.php?var=arg
,这样您的脚本就可以用通常的方式访问GET参数
var
。我该怎么做呢?