我在 .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
图案。