Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 重写2个特定URL时出现500内部服务器错误_Php_.htaccess - Fatal编程技术网

Php 重写2个特定URL时出现500内部服务器错误

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

当我试图重写这些特定的URL/文件(item.php&purchase.php)时,我不断收到一个500内部服务器错误,其余的都正常

我已经尝试了很多方法来解决这个问题,但似乎没有任何效果,这很奇怪,因为所有其他URL都可以工作,但这两个似乎出于某种原因不想工作

.htaccess文件

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]