Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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_Mod Rewrite - Fatal编程技术网

如何使用.htaccess在多次重写中获取引用变量

如何使用.htaccess在多次重写中获取引用变量,.htaccess,mod-rewrite,.htaccess,Mod Rewrite,这些重写规则似乎不起作用。这是不可能的还是我遗漏了什么 有问题的规则是第二个,请注意反向引用%1 RewriteCond %{REQUEST_URI} ^/([a-zA-Z\.]+)/.*$ [NC] RewriteCond %{HTTP_COOKIE} route_controller_%1=([^;]+) [NC] RewriteRule ^(.*)$ http://example2.com/%1/_/$1 [L] 这就是我所期待的。给定URL http://example.com/abc

这些重写规则似乎不起作用。这是不可能的还是我遗漏了什么

有问题的规则是第二个,请注意反向引用%1

RewriteCond %{REQUEST_URI} ^/([a-zA-Z\.]+)/.*$ [NC]
RewriteCond %{HTTP_COOKIE} route_controller_%1=([^;]+) [NC]
RewriteRule ^(.*)$ http://example2.com/%1/_/$1 [L]
这就是我所期待的。给定URL

http://example.com/abc/home
第一条规则应将abc存储在%1中 我想要一个名为route_controller_abc的cookie的第二条规则,如果找到了 然后第三条规则将重新连接到

http://example2.com/thevalueofthecookie/_/home
但是seconf规则似乎没有使用%1反向引用


有什么想法吗?

原因是字符串替换只发生在cond的第一个参数中,而不发生在它的rexexp中。您必须使用
\1
等来模拟regexp中的参数

您还可以选择规则regexp中的目录,因为执行顺序是规则regexp,cond1,cond2,。。。规则替换。例如,
^(*.?)/.*$
对于
abc/home
$1
设置为
abc
,将$0设置为
abc/home
。因此,我会尝试以下方法:

RewriteCond $1:%{HTTP_COOKIE} ^(.*?):.*\broute_controller_\1=([^;]+) [NC]
RewriteRule ^(*.?)/.*$        http://example2.com/%2/_/$0            [L]
请注意,控制器现在位于%2中,因为%1用于绑定cond regexp中的目录


希望这有助于回答您的直接问题。Hover,如果使用这种未经验证的cookies进行重定向,我会有点紧张。如果我这样做,我要么加强参数
([^;]+)
的验证,要么将其移动到一个小的PHP重定向器脚本,并在那里进行验证:-)

好的,我会尝试一下。关于用于重定向的未验证cookie。我计划让我的应用程序在example2.com上进行验证。我遗漏了什么吗?不,使用应用程序来做这件事是可以的,但请记住,恶意用户总是可以编辑cookie,所以你不能信任他们的内容。用户几乎可以向
%2
中注入任何内容。因此,如果您知道这是一个简单的词,例如,那么为什么不
(\w+)
,这将有效地防止恶意注入?我不希望是一个简单的词,而是一个完全限定的域名。顺便说一句,我无法让规则在我的系统上按书面形式运行。在重写过程中,我将$1更改为%1。在RewriteRule中,我将
^(*.?)/.*$
更改为
^(.*)$
我在RewriteRule中遇到了一个内部服务器错误。听起来好像您没有摆脱
RewriteCond%{REQUEST\u URI}
行。