Php 重写2个特定URL时出现500内部服务器错误
当我试图重写这些特定的URL/文件(item.php&purchase.php)时,我不断收到一个500内部服务器错误,其余的都正常 我已经尝试了很多方法来解决这个问题,但似乎没有任何效果,这很奇怪,因为所有其他URL都可以工作,但这两个似乎出于某种原因不想工作 .htaccess文件Php 重写2个特定URL时出现500内部服务器错误,php,.htaccess,Php,.htaccess,当我试图重写这些特定的URL/文件(item.php&purchase.php)时,我不断收到一个500内部服务器错误,其余的都正常 我已经尝试了很多方法来解决这个问题,但似乎没有任何效果,这很奇怪,因为所有其他URL都可以工作,但这两个似乎出于某种原因不想工作 .htaccess文件 Options -Indexes RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME}\.p
Options -Indexes
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ $1.php
ErrorDocument 500 "500"
ErrorDocument 404 "404"
ErrorDocument 403 "403"
RewriteRule ^users/([^/]*)$ /user/profile.php?username=$1
RewriteRule ^users/([^/]*)/inventory$ /user/GetUserInventory.php?username=$1
RewriteRule ^market/item/([^/]*)$ /market/item.php?id=$1
RewriteRule ^market/item/([^/]*)/purchase$ /market/purchase.php?id=$1
RewriteRule ^community/([^/]*)$ /communities/view.php?id=$1
RewriteRule ^community/([^/]*)/join$ /communities/join.php?id=$1
RewriteRule ^community/([^/]*)/manage$ /communities/manage.php?id=$1
RewriteRule ^game/([^/]*)$ /games/view.php?id=$1
item.php
在其他重写之后,这些指令应该位于.htaccess
文件的末尾。它们也是不正确的-虽然将它们放在文件的末尾可以避免立即出现的问题,但仍可能导致其他URL出现问题
在当前状态下,当您请求example.com/market/item/1
(看起来,/market
是一个物理目录,/item.php
是该目录中的一个文件)时
简而言之…它会导致无休止的重写循环:
/market/item/1.php
/market/item/1.php.php
/market/item/1.php.php.php
/market/item/1.php.php.php.php
etc.
它会中断(在10次迭代后),并向浏览器发送500个响应
请求/market/item/1/purchase
时会发生非常类似的过程:
/market/item/1/purchase.php
/market/item/1/purchase.php.php
/market/item/1/purchase.php.php.php
/market/item/1/purchase.php.php.php.php
etc.
细节…
REQUEST\u FILENAME
是/market/item
(忽略目录前缀),而PATH\u INFO
是/1
(对于后面的内容很重要)/market/item
不是一个目录(第一个条件),但/market/item.php
是一个文件(第二个条件)-因此两个条件都成功满足
然后,RewriteRule
指令将/market/item/1
重写为/market/item/1.php
(显然不正确,并非本意)。由于此规则上没有L
标志,因此处理将继续。。。出于其余规则的考虑,PATH\u INFO
(从初始请求,/1
)被附加到结果URL中,成为/market/item/1.php/1
(创建了DPI
标志-放弃路径信息-以防止这种特定行为)
/market/item/1.php/1
与当前过程中的任何进一步规则都不匹配,因此重写引擎从顶部开始,使用/market/item/1.php
REQUEST\u FILENAME
再次是/market/item
,而PATH\u INFO
现在是/1.php
/market/item
不是一个目录(第一个条件),但/market/item.php
是一个文件(第二个条件)-因此这两个条件第二次都成功满足
然后,RewriteRule
指令将/market/item/1.php
重写为/market/item/1.php.php
。由于此规则上没有L
标志,因此处理将继续。。。为了遵守其余规则,将路径_INFO
(这次来自请求/1.php
)附加到结果URL中,成为/market/item/1.php.php/1.php
/market/item/1.php.php/1.php
与当前过程中的任何进一步规则都不匹配,因此重写引擎从顶部开始,使用/market/item/1.php.php
GOTO#4(更新URL路径)等重写循环,500错误
当请求/market/item/1/purchase
时,会发生一个非常类似的过程。请求文件名
与/market/item
相同(因此它再次检查/market/item.php
是否存在,而不是purchase.php
),除了路径信息
是/1/purchase
(不是/1
)。而.php
扩展附加到的初始URL路径自然是/market/item/1/purchase
(而不是/market/item/1
)
修理
如果您遵循了“混乱的混乱”,您将看到检查“path/to/file”+“.php”是否存在的条件不一定与实际将请求重写为“URL path”+“.php”的规则相同。(“路径/到/文件”与“URL路径”不同)。要解决此问题,应将其写成:
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
这里不需要真正的目录检查,因为如果它是一个目录,接下来的文件检查必须失败(除非您的目录名以.php
结尾)。%{DOCUMENT\u ROOT}/$1.php
检查现在实际上与$1.php
(正在重写的文件)是“相同的”
在RewriteCond
TestString中,文字点不需要反斜杠转义-这是一个“普通”字符串,而不是正则表达式
不要忘记L
标志。这个规则块现在应该放在.htaccess
文件的末尾
总结
您请求的实际URL是什么。。。不起作用的和起作用的。附加.php
扩展名的规则可能存在导致此问题的潜在错误,但在不知道确切URL的情况下,我们无法确定这是当前的问题。此外,文件系统结构。。。什么是物理目录和文件?哪两个失败?错误是什么?您可以使用此代码进行SQL注入。您是否通过直接访问php文件来确认其工作正常?这可能与重写有关,也可能与重写无关。@难以置信是的。这些文件确实有效。@user3783243 item.php和purchase.php不起作用,但只有在转到重写的URL时才起作用。如果我转到未重写的URL,它会工作。可能仍然需要翻转这两行,以便首先匹配purchase
。@MartinZeitler反转这两个指令(以及其他指令)可能更符合逻辑(通常更安全-首先是最具体的规则)。但是,由于前面规则中的结束模式([^/]*)$
,因此在这种情况下,这不重要。如果他们改为使用更通用的(.*)$
——那么顺序就很重要了。
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]
Options -Indexes
RewriteEngine on
ErrorDocument 500 "500"
ErrorDocument 404 "404"
ErrorDocument 403 "403"
RewriteRule ^users/([^/]*)$ /user/profile.php?username=$1 [L]
RewriteRule ^users/([^/]*)/inventory$ /user/GetUserInventory.php?username=$1 [L]
RewriteRule ^market/item/([^/]*)$ /market/item.php?id=$1 [L]
RewriteRule ^market/item/([^/]*)/purchase$ /market/purchase.php?id=$1 [L]
RewriteRule ^community/([^/]*)$ /communities/view.php?id=$1 [L]
RewriteRule ^community/([^/]*)/join$ /communities/join.php?id=$1 [L]
RewriteRule ^community/([^/]*)/manage$ /communities/manage.php?id=$1 [L]
RewriteRule ^game/([^/]*)$ /games/view.php?id=$1 [L]
# Append .php on remaining requests
RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule (.*) $1.php [L]