在PHP/htaccess中使用正斜杠获取参数

在PHP/htaccess中使用正斜杠获取参数,php,.htaccess,mod-rewrite,url-rewriting,Php,.htaccess,Mod Rewrite,Url Rewriting,最近我在htaccess和PHP方面遇到了一些问题。 我有一个正在运行的代码,它从网址中删除“.php”和.htacess文件,然后: 这个地址 http://localhost/dashboard.php 进入 代码如下: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.php -f RewriteRule ^(.*)$ $1.php [NC,L] 但现在我试图通过正

最近我在htaccess和PHP方面遇到了一些问题。 我有一个正在运行的代码,它从网址中删除“.php”和.htacess文件,然后:

这个地址

http://localhost/dashboard.php
进入

代码如下:

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):


我在这里遗漏了什么吗?

500错误很可能是内部重写循环的结果,因为检查请求+
.php
扩展名(即
%{request\u FILENAME}\.php
)映射到文件的条件不一定与您要重写的URL路径相同(即
/$1.php?id=$2
)。请参阅以下详细讨论此问题的ServerFault问题:

请尝试以下操作:

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\u ROOT}/$1.php
)中的文字点,因为这是一个“普通”字符串,而不是正则表达式,因此点在这里没有特殊意义

需要禁用多视图,这些指令才能按预期运行。(这可能已经在您的服务器上被禁用。)


旁白:

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

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


(您可以使用
.htaccess
删除
.php
扩展,这只是为了SEO的好处。但这需要一个非常不同的规则-外部重定向。)

500错误很可能是内部重写循环的结果,因为条件检查请求+
.php
扩展(即
%{REQUEST_FILENAME}\.php
)映射到文件的路径不一定与您要重写到的URL路径相同(即
/$1.php?id=$2
)。请参阅以下详细讨论此问题的ServerFault问题:

请尝试以下操作:

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\u ROOT}/$1.php
)中的文字点,因为这是一个“普通”字符串,而不是正则表达式,因此点在这里没有特殊意义

需要禁用多视图,这些指令才能按预期运行。(这可能已在服务器上禁用。)


旁白:

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

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


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

URL重写不能以这种方式工作……您无法更改地址栏上显示的内容(例如带有“.php”的版本)除非从文件中物理删除扩展名,否则将始终存在!)URL重写不会以这种方式工作……您无法更改地址栏中显示的内容(例如,除非从文件中物理删除扩展名,否则带有“.php”的版本将始终存在!)
Options -MultiViews

RewriteEngine On

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