重写 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
我正在尝试从 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