.htaccess 重写以使用和不使用 $_GET 变量

.htaccess rewrite to work with and without $_GET variable

我有一个 player.php 页面,如果没有定义 playerid GET 变量,那么它将获取当前用户在全局变量中定义的。这是工作。就在我尝试实现重写时遇到了问题。

首先我有这个:

RewriteEngine On

RewriteRule ^player/([^/]+) player.php?playerid= [NC,L]

^ 如果设置了 playerid 变量,工作正常,但如果没有设置,我就得到 404

接下来我试图解决这个问题

RewriteEngine On

RewriteRule ^player player.php [NC]
RewriteRule ^player/([^/]+) player.php?playerid= [NC,L]

^ 所以现在他们都只加载当前用户的个人资料,而不管 playerid

所以我完全改变了方法

RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ .php [NC]
RewriteRule ^player/([^/]+) player.php?playerid= [NC,L]

^ 这适用于不设置 playerid,但如果设置了它,它会在末尾附加 .php。所以它认为 player/1player/1.php。这当然打破了我试图 运行 获取玩家信息的查询。

您的第一次尝试是正确的,但您需要禁用 MultiViews 选项。

Options -MultiViews
RewriteEngine On

RewriteRule ^player/([^/]+)/?$ player.php?playerid= [NC,L,QSA]

选项 MultiViewsApache's content negotiation module 使用,它在 之前 mod_rewrite 运行并使 Apache 服务器匹配文件的扩展名。所以 /file 可以在 URL 中,但它会服务于 /file.php.