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
.htaccess HTACCESS如何“访问”;削减;在某一点上的URL_.htaccess_Mod Rewrite - Fatal编程技术网

.htaccess HTACCESS如何“访问”;削减;在某一点上的URL

.htaccess HTACCESS如何“访问”;削减;在某一点上的URL,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,我是.htaccess新手,对它不太了解。最近,我构建了以下代码: RewriteEngine On RewriteCond %{HTTP_HOST} (.*) RewriteCond %{REQUEST_URI} /api/v2/ RewriteRule ^api/v2(.*) /api/v2/api.php?input=$1 这是在根公用文件夹(example.com/.htaccess)中。但是现在我必须创建第二个重写,我想在example.com/api/v2/文件夹中创建.htacc

我是
.htaccess
新手,对它不太了解。最近,我构建了以下代码:

RewriteEngine On
RewriteCond %{HTTP_HOST} (.*)
RewriteCond %{REQUEST_URI} /api/v2/
RewriteRule ^api/v2(.*) /api/v2/api.php?input=$1
这是在根公用文件夹(
example.com/.htaccess
)中。但是现在我必须创建第二个重写,我想在
example.com/api/v2/
文件夹中创建
.htaccess
文件。我试图删除每个重写规则中的
/api/v2/
部分,但唯一得到的是错误500

我想要达到的目标:


如果有人使用此链接:
https://example.com/api/v2/test/test/123
,我想把它做成
https://example.com/api/v2/api?input=test/test/123
使用位于
example.com/api/v2文件夹中的
.htaccess
首先解决现有规则:

第一个重写条件是完全多余的,可以简单地删除。第二个条件只是断言在
v2
之后有一个斜杠,这可以与
重写规则
模式合并。因此,上述内容相当于一个
重写规则
指令,如下所示:

RewriteRule ^api/v2(/.*) /api/v2/api.php?input=$1 [L]
这将在内部将请求从
/api/v2/test/test/123
重写为
/api/v2/api.php?input=/test/test/123
-注意
input
URL参数值上的斜杠前缀

但是,除非在包含mod_rewrite指令的子目录中有另一个
.htaccess
文件,否则这将创建一个重写循环(500错误)

还要注意,您可能应该在此处包含
L
标志,以防止进一步重写请求(如果您有其他指令)

如果有人使用此链接:
https://example.com/api/v2/test/test/123
,我想把它做成
https://example.com/api/v2/api?input=test/test/123
.htaccess
位于
example.com/api/v2
文件夹中

我假设
/api?
是一个打字错误,应该是
/api.php?
。还请注意,URL参数值的开头省略了斜杠(与上述规则不同)

我试图删除每个重写规则中的
/api/v2/
部分,但唯一得到的是错误500

这是正确的想法,但是,您需要小心重写循环(即500错误响应),因为重写的URL可能与您尝试重写的正则表达式匹配

请在
/api/v2/.htaccess
文件中尝试以下操作:

RewriteEngine On

RewriteCond %{REQUEST_URI} !api\.php$
RewriteRule (.*) api.php?input=$1 [L]
前面的
RewriteCond
指令检查请求是否已经针对
api.php
,从而避免了重写循环,因为模式
*
自然会匹配任何内容,包括
api.php
本身

您可以通过使正则表达式更具体来避免附加条件。例如,如果请求的URL路径不能包含点,则上述
RewriteCond
RewriteRule
指令可以编写为单个指令:

RewriteRule ^([^.]*)$ api.php?input=$1 [L]
regex
[^.]*
匹配除点之外的任何内容,因此避免匹配
api.php

或者,仅匹配允许的字符。例如,小写的a-z、数字和斜杠(自然不包括点),它们覆盖测试字符串
test/test/123

RewriteRule ^([a-z0-9/]*)$ api.php?input=$1 [L]
或者,如果始终应该有3个路径段,
//
,则具体如下:

RewriteRule ^([a-z]+/[a-z]+/\d+)$ api.php?input=$1 [L]

听起来,您想用子目录中的
.htaccess
文件替换根目录中的
.htaccess
文件-您不是在第一条规则之外创建第二条规则吗?只是为了澄清一下,您在根
.htaccess
文件中的指令会将请求重写为
/api/v2/api?input=/test/test/123
(注意URL参数值上的斜杠前缀),而不是您在需求中所述的
/api/v2/api?input=test/test/123
(无斜杠前缀)?嘿,我发现了一个问题。我的代码是:`RewriteCond%{REQUEST_URI}上的RewriteEngine!api\.php$RewriteRule^([a-zA-Z0-9/]*)$api.php?input=$1[L]`(我试图添加大写字母支持,但收到一个错误)请求如下所示:结果是您看到的结果似乎与您发布的指令无关?您的
.htaccess
文件中是否有其他指令?(在您发布的指令中,
RewriteCond
指令不是必需的——如上所述。)我的文件结构如下:ROOT->API->[index.php,V1,V2],(大写=文件夹名称),我得到的结果是ROOT/API/index.php还发现了1个问题-如果我在这里使用API word,它会崩溃(常规404错误)。在V2文件夹中,我只有index.php(空文件)和这个.htaccess实际上我使用了这个规则-RewriteRule^([^.]*)$api.php?input=$1[L]。我将手动验证输入。谢谢你的帮助!太好了。尽管就您发布的示例URL而言,
^([^.]*)$
^([a-zA-Z0-9/]*)$
之间应该没有区别?“在V2文件夹中,我只有index.php(空文件)和this.htaccess”-但您正在重写V2文件夹中的
api.php
,而不是
index.php
,因此
api.php
也必须存在?
RewriteRule ^([a-z]+/[a-z]+/\d+)$ api.php?input=$1 [L]