首页 > 解决方案 > PHP / htaccess中带有正斜杠的GET参数

问题描述

最近我在使用 htaccess 和 PHP 时遇到了一些麻烦。我有一个正在运行的代码,它只使用 .htacess 文件从网址中删除“.php”,转向:

这个地址

http://localhost/dashboard.php

进入

http://localhost/dashboard

这是代码:

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php [NC,L]

但现在我试图通过正斜杠传递一些 GET 参数。像这样:

转这个:

http://localhost/dashboard.php?id=20

进入这个:

http://localhost/dashboard/20

我已经尝试过此代码,但不起作用(错误 500):

RewriteEngine on

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

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^/?(.*)/?$ /$1.php [END]

我在这里错过了什么吗?

标签: php.htaccessmod-rewriteurl-rewriting

解决方案


500 错误很可能是内部重写循环的结果,因为检查请求 +.php扩展名(即。%{REQUEST_FILENAME}\.php)映射到文件的条件不一定与您正在重写的 URL 路径(即。/$1.php?id=$2)相同。请参阅对以下详细讨论此问题的 ServerFault 问题的回答:https ://serverfault.com/questions/989333/using-apache-rewrite-rules-in-htaccess-to-remove-html-causing-a-500-错误

请尝试以下操作:

Options -MultiViews

RewriteEngine On

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

这可以处理两种情况:

  • /dashboard内部重写为/dashboard.php?id=
  • /dashboard/20内部重写为/dashboard.php?id=20

使RewriteRule 模式更具限制性后,测试请求是否映射到文件的检查似乎是多余的,因为模式不太可能与真实文件匹配。此外,任何真正的文件 +.php也不太可能是文件 - 因此不需要进行两项检查。

不需要反斜杠转义RewriteCond TestString中的文字点(即。%{DOCUMENT_ROOT}/$1.php),因为这是一个“普通”字符串,而不是正则表达式,因此点在这里没有特殊含义。

需要禁用 MultiViews 才能使这些指令按预期运行。(这可能已在您的服务器上禁用。)


在旁边:

我有一个正在运行的代码,它仅使用 .htacess 文件从网址中删除“.php”

虽然这通常以这种方式(错误地)编写,但这不是那些指令的作用。(.php扩展名可能已经在您的 HTML 源代码中删除。)事实上,这些指令完全相反......它们将.php文件扩展名添加回请求的(无扩展名)URL,以在内部将请求重写回底层文件系统路径.

(您可以使用.htaccess删除扩展名,.php以利于 SEO(仅)。但这需要一个非常不同的规则 - 外部重定向。)


推荐阅读