重写 URL : 从 URL 中删除子文件夹和文件扩展名

Rewrite URL : remove sub folders and file extension from URL

我正在尝试从 URL 中删除 .php 文件扩展名和文件夹 && 子文件夹(如果它们存在)。

案例一

输入:

127.0.0.1/project/folder/alfa.php

输出:

127.0.0.1/project/alfa

案例二

输入:

127.0.0.1/project/folder/subfolder/beta.php

输出:

127.0.0.1/project/beta

这是我目前得到的:

只删除扩展名工作正常,删除文件夹时遇到问题

# Turn mod_rewrite on
RewriteEngine On

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} -f
RewriteRule ^((?! folder/).+?)/?$ folder/ [L,NC]


RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule !.*\.php$ %{REQUEST_FILENAME}.php [QSA,L]

请指教 谢谢。

根据您在对问题的评论中所做的澄清 - 这很难单独通过 RewriteRule 动态处理。

考虑一下:

Apache 如何知道 /project/beta 映射到 /project/folder/subfolder/beta.php/project/alfa 映射到 /project/folder/alfa.php

您可以像这样对它们进行硬编码:

RewriteRule ^project/beta/? /project/folder/subfolder/beta.php [QSA,L]

RewriteRule ^/project/alfa/? /project/folder/alfa.php [QSA,L]

如果由于此处需要大量规则而不可行,我将尝试通过脚本解决此问题。像这样:

如果请求的资源不是文件或目录,则将其发送到脚本。然后让脚本搜索目标目录结构,例如 /project 以查找所有 php 文件,这些文件与掩码 URL 的第二部分(alfa / beta 部分)相匹配。如果只找到一个文件,则需要它才能 运行 它。

您可以在 /project/ 目录中拥有此 .htaccess:

RewriteEngine On
RewriteBase /project/

# rewrite to folder/subfolder/
RewriteCond %{DOCUMENT_ROOT}/project/folder/subfolder/.php -f
RewriteRule ^(.+?)/?$ folder/subfolder/.php [L]

# rewrite to folder/
RewriteCond %{DOCUMENT_ROOT}/project/folder/.php -f
RewriteRule ^(.+?)/?$ folder/.php [L]

您可以使用以下正则表达式从 URL 中捕获必填字段。然后使用捕获的值 1、2 生成输出。

([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\/[A-Za-z0-9]*).*(\/.*)\.php

您可以在此处查看 demo。它捕获 1 中的地址和父文件夹以及 2 中的文件名。

注意:我认为地址是 ipv4