Apache 仅在路径包含以下内容时执行操作

Apache 仅在路径包含以下内容时执行操作

我在 .htaccess 中使用以下内容从 .php 文件中删除扩展名:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

它运行得很好,但是我怎样才能编写一个条件语句,使得它只有从给定路径访问时才有效?

我正在使用伪代码,但我正在寻找类似这样的内容:

if( path === '/my/path' || path === 'my/path/example.html' ) {
    RewriteEngine On
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^\.]+)$ $1.php [NC,L]
}

上述代码仅当从以下位置访问时才有效:

https://www.example.com/my/path

或者:

https://www.example.com/my/path/example.html

答案1

您可以添加检查请求的 URL 路径的条件。

例如:

RewriteEngine On

RewriteCond %{REQUEST_URI} ^/my/path
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [L]

仅当请求的 URL 路径符合以下要求时,才会处理上述内容开始 /my/path,所以自然会包括/my/path/foo/my/path/bar等等。

请注意,你提到/my/path/example.html,但RewriteRule 图案( ^([^.]+)$) 已排除任何包含点的 URL 路径,因此此路径/文件不会包含在当前编写的规则中。此正则表达式是此规则不可或缺的一部分,因为它是当前编写的,因此您不能简单地“允许点”。

NC上的标志是RewriteRule多余的,您不需要使用反斜杠转义字符类内的文字点。

要将其应用于多个路径,请添加多个条件(或使用正则表达式交替)。 例如:

RewriteCond %{REQUEST_URI} ^/my/path1 [OR]
RewriteCond %{REQUEST_URI} ^/my/path2 [OR]
RewriteCond %{REQUEST_URI} ^/my/path3
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^.]+)$ $1.php [L]

如果路径很短,您可以使用正则表达式交替。例如^/(my/path1|my/path2|my/path3)。。


在旁边:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]

此规则.php仅根据最初请求的 URL(不带点)是否未映射到文件来向请求附加扩展名,而不管相应的<url>.php文件是否实际存在。这是“可以的”,但取决于您的 404 错误文档的构造方式,您最终可能会<url>.php向最终用户公开,而不是简单地公开<url>(他们请求的 URL)。此规则还会重写目录,这可能是也可能不是问题。

您可以在重写之前检查相应的.php文件是否存在,而不是检查请求的 URL 是否映射到文件。

例如:

RewriteCond %{DOCUMENT_ROOT}/$1.php -f
RewriteRule ^([^.]+)$ $1.php [L]

现在仅当相应文件存在时才会重写请求.php


更新:

但是我如何才能专门匹配路径?/my/path不应包括/my/path/foo。 列出的路径RewriteCond应仅与这些路径匹配。

在这种情况下,听起来好像您只需要标准重写。(?)如果您只是针对特定的 URL 路径而不是目录树中的所有文件,那么似乎没有必要增加上述规则的复杂性?

例如:

RewriteRule ^my/path1$ $0.php [L]
RewriteRule ^my/path2$ $0.php [L]
RewriteRule ^my/path3$ $0.php [L]

反向$0引用只是节省了重复,并包含与以下匹配的 URL 路径:RewriteRule 图案

相关内容