我正在尝试删除.php文件扩展名和文件夹&& URL中的子文件夹(如果存在)。
案例1
输入:
127.0.0.1/project/folder/alfa.php
输出:
127.0.0.1/project/alfa
案例2
输入:
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]
请指教 感谢。
答案 0 :(得分:3)
您可以在/project/
目录中拥有此.htaccess:
RewriteEngine On
RewriteBase /project/
# rewrite to folder/subfolder/
RewriteCond %{DOCUMENT_ROOT}/project/folder/subfolder/$1.php -f
RewriteRule ^(.+?)/?$ folder/subfolder/$1.php [L]
# rewrite to folder/
RewriteCond %{DOCUMENT_ROOT}/project/folder/$1.php -f
RewriteRule ^(.+?)/?$ folder/$1.php [L]
答案 1 :(得分:1)
您可以使用以下正则表达式从URL捕获必填字段。然后使用捕获的值1,2来生成输出。
([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\/[A-Za-z0-9]*).*(\/.*)\.php
您可以在此处查看demo。它捕获1中的地址和父文件夹以及2中的文件名。
注意:我认为地址是ipv4
答案 2 :(得分:0)
根据您对问题的评论中的澄清 - 仅通过RewriteRule
动态处理这一点很难。
考虑一下:
当/project/beta
映射到/project/folder/subfolder/beta.php
时,Apache如何知道/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
,以查找与屏蔽URL的第二部分(alfa / beta部分)匹配的所有php文件。如果只找到一个文件则需要它才能运行它。