Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.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 设置.htaccess规则以指定不同的文件夹_Php_Apache_.htaccess - Fatal编程技术网

Php 设置.htaccess规则以指定不同的文件夹

Php 设置.htaccess规则以指定不同的文件夹,php,apache,.htaccess,Php,Apache,.htaccess,如果我在url www.mydomain.com/compare.php中输入“public\u html”作为根目录,我想在.htaccess中设置一个规则,否则任何内容都会在url集合根目录中作为“public”文件夹出现 RewriteRule ^(?!compare-source.php).*)$ public/$1 [L] 我想达到以下结果 如果url是www.mydomain.com/compare.php点击以下文件 public_html/compare.php public

如果我在url www.mydomain.com/compare.php中输入“public\u html”作为根目录,我想在.htaccess中设置一个规则,否则任何内容都会在url集合根目录中作为“public”文件夹出现

RewriteRule ^(?!compare-source.php).*)$ public/$1 [L]
我想达到以下结果

如果url是www.mydomain.com/compare.php点击以下文件

public_html/compare.php
public_html/public/index.php
如果URL是www.mydomain.com/www.mydomain.com/home等,点击以下文件

public_html/compare.php
public_html/public/index.php
我在正则表达式和这些apache规则方面都很弱:-(有人能给我一个描述良好的解决方案吗

欢迎您的回答,请您详细描述一下这些疯狂的事情是如何运作的。谢谢。

试试:

RewriteEngine On
RewriteCond %{REQUEST_URI} !^/public
RewriteRule ^((?!compare\.php).*)$ /public/$1 [L]
该指令启用或禁用运行时重写引擎

该指令定义了一个规则条件。以下规则仅在满足此条件时使用;在我们的例子中,如果请求URI(请求URL的路径组件)没有开始(因为
)开始(因为
^
)对于
/public
。我们需要这个条件,因为我们不想重写已经重写的URL-这将导致循环和内部错误500

最后,将regex模式(
^((?!compare\.php.*)$
)与主机名和端口后的URL部分匹配,且不带前导斜杠。如果模式匹配,则替换(
public/$1
)将替换原始URL路径

在普通语言中,如果URL路径不是以
compare.php
(因为
?!
)开头,则在开头(
^
)和结尾(
$
)之间选择所有内容(
*
),并将其放入变量
$1
),然后将原始URL路径替换为
/public/$1

@阿努巴瓦的回答也是正确的,他只是把这两个条件都放在了重写规则中,而且它可以写得更具可读性:

RewriteCond %{REQUEST_URI} !^/public
RewriteCond %{REQUEST_URI} !^/compare\.php
RewriteRule ^(.*)$ /public/$1 [L]

您可以在站点根目录中使用此.htaccess:

RewriteEngine On

# route /home/ or /home to /
RewriteRule ^home/?$ / [L,NC]

# if not compare-source.php or public/* then route to /public/*
RewriteRule ^(?!public/|compare-source\.php$).*)$ public/$1 [L,NC]

也许你可以对它的作用做更多的解释,以使它成为一个更完整的答案。@Dusan Bajic你的解决方案非常匹配,但如果你能描述它是如何工作的……Thankstorry没有看到你的答案-我的答案非常相似,所以我删除了它