php - 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]
我在这里错过了什么吗?
解决方案
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(仅)。但这需要一个非常不同的规则 - 外部重定向。)
推荐阅读
- javascript - 如何使用 Javascript 显示模态图像 - 但也有一个伪叠加
- angular - $ ng gs 服务/数据 --module=app.module
- reactjs - ReactJS 状态更新落后一步
- sed - 使用 sed 替换 GCS json 文件中的日期时间值
- sql - 将表中具有特定值的一列分成两列
- javascript - 我们可以在生成器中返回一个方法吗?
- reactjs - 使用键值对填充反应组件中的选项
- c - 当我运行代码时,为什么在创建第一个形状后,在过渡到第二个形状时会留下很大的间隙?
- javascript - 如何在没有本地主机的情况下打开网页
- python - 我尝试添加应该询问用户是否想再次播放的代码