如何在 htaccess 文件中添加/忽略子文件夹?

如何在 htaccess 文件中添加/忽略子文件夹?

我已经在构建了一个应用程序http://url/sdf19/

我在 /sdf19/ 中放置了一个 .htaccess,其中包含用于清理 URL 的 RewriteRule。

但是我已经构建了一个 PDF 生成工具,它位于子文件夹中/inc/tools。我需要直接链接到它以在标题之前运行。

尽管搜索了几个小时,尝试了代码片段、生成器等,我仍然无法让任何请求被http://url/sdf19/inc/tools允许,除非现有的 RewriteRule 设置接管

这是我的起始文件

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-z]+)\/?$ index.php?page=$1 [NC]
RewriteRule ^([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&id=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/?$ index.php?page=$1&action=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&action=$2&id=$3 [NC]

尝试过的方法:

我试图在第 4 行添加这个; RewriteCond %{REQUEST_URI} !^ inc/tools/ [NC] 这给了 RewriteCond: bad param 错误

我试图将其添加到第 2 行;

RewriteCond %{REQUEST_URI} ^/inc/tools/(.*)$
RewriteRule ^.*$ - [L]

我尝试在 RewriteEngine OFF 的情况下添加 .htaccess /inc/tools,但没有成功。

我尝试了顶部帖子中链接的 .htaccess 测试器,但虽然我的文件(上面)在现实生活中可以工作,但它却对上面的所有内容产生“规则不满足”!

总结

期望的结果是我可以直接访问http://url/sdf19/inc/tools> 到目前为止我尝试过的所有内容,我被重定向到基础http://url/sdf19/

答案1

关于您当前规则的一些讨论……

我试图在第 4 行添加这个;RewriteCond %{REQUEST_URI} !^ inc/tools/ [NC]这给了 RewriteCond: bad param 错误

因为你有一个错误的空间在中间条件模式 !^ inc/tools/。但是,该表达式仍然不会给出正确的结果(见下文)。

我试图将其添加到第 2 行;

RewriteCond %{REQUEST_URI} ^/inc/tools/(.*)$
RewriteRule ^.*$ - [L]

您已经接近正确答案。但是,REQUEST_URI服务器变量包含完整的 URL 路径,而不是相对于文件.htaccess所在位置的 URL 路径。因此,这需要采用以下形式:

RewriteCond %{REQUEST_URI} ^/sdf19/inc/tools/
RewriteRule ^ - [L]

这需要放在文件顶部附近.htaccess,紧接着RewriteEngine On指令之后。(.*)$条件模式是多余的,就像RewriteRule 图案 ^.*$。但是,这可以更有效地编写为单个指令,并使用RewriteRule 图案而是。然后您可以省略/sdf19子目录。例如:

RewriteRule ^inc/tools/ - [L]

我尝试.htaccess/inc/tools中添加 a RewriteEngine OFF,但没有成功。

嗯,那应该已经起作用了。(除非父.htaccess文件中的 mod_alias 指令存在冲突?)因此,鉴于您在问题中所述,尚不清楚为什么它不起作用。您的.htaccess文件中还有其他指令吗?

到目前为止我尝试过的所有方法都被重定向到基地http://url/sdf19/

这也很奇怪,因为到目前为止您显示的任何内容都不会导致外部重定向。您的.htaccess文件中还有其他指令吗?也许是 mod_aliasRedirectRedirectMatch指令?

RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^([a-z]+)\/?$ index.php?page=$1 [NC]
RewriteRule ^([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&id=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/?$ index.php?page=$1&action=$2 [NC]
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&action=$2&id=$3 [NC]

A潜在的这些指令的问题是RewriteCond指令仅适用于第一的 RewriteRule接下来。因此,上面的第 2、3 和 4RewriteRule条指令是无条件执行的,并解释了为什么请求/sdf19/inc/tools第三规则。

您可能需要在之前添加相同的条件每一个 RewriteRule(即,仅当请求未映射到文件且未映射到目录时,才会处理规则)。或者,如果请求的是文件或目录,则否定其含义并阻止进一步处理 - 但是,这可能取决于文件后面是否还有更多指令需要在这些条件下进行处理。

您还缺少L这些指令上的标志,因此处理(不必要地?)继续通过您的文件。

因此,请尝试以下操作:

# Prevent further processing if a file or directory is requested
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
 
# Route other URLs
RewriteRule ^([a-z]+)\/?$ index.php?page=$1 [NC,L]
RewriteRule ^([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&id=$2 [NC,L]
RewriteRule ^([a-z]+)\/([a-z]+)\/?$ index.php?page=$1&action=$2 [NC,L]
RewriteRule ^([a-z]+)\/([a-z]+)\/([0-9]+)\/?$ index.php?page=$1&action=$2&id=$3 [NC,L]

答案2

您是否尝试过在配置文件中添加“RewriteEngine On”?

run_rewritemap_programs(server_rec *s , apr_pool_t *p){
if (conf->state == ENGINE_DISABLED) { // usage of "RewriteEngine"
  return APR_SUCCESS; // early return
rewritemap_program(...); // usage of "RewriteRule" 
}

由于“RewriteEngine”的配置默认值为“Off”,从上面的代码片段来看,只有在配置文件中明确声明“RewriteEngine On”时,“RewriteRule”才会启用。

另外值得一提的是“RewriteEngine”的配置默认值是“Off”,因此设置“RewriteEngine Off”本身是一个无声配置错误,因为它不会影响任何系统行为。

相关内容