【问题标题】:Rewrite URL : remove sub folders and file extension from URL重写 URL:从 URL 中删除子文件夹和文件扩展名
【发布时间】:2017-08-16 10:13:31
【问题描述】:

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

案例 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]

请指教 谢谢。

【问题讨论】:

  • 我认为您需要对项目目录进行硬编码。
  • 您的意思是屏蔽还是重定向?即,是我访问127.0.0.1/project/folder/subfolder/beta.php 并被重定向到127.0.0.1/project/beta 的场景,还是您试图让用户访问127.0.0.1/project/beta 作为127.0.0.1/project/folder/subfolder/beta.php 的掩码?
  • @Bananaapple 试图让用户访问 127.0.0.1/project/beta 作为 127.0.0.1/project/folder/subfolder/beta.php 的掩码
  • 如果有 2 个文件夹和 3-4 个子文件夹怎么办?你如何确定应该将它们重定向到哪个文件夹?
  • 127.0.0.1/project/beta 可以重写为127.0.0.1/project/folder/subfolder/beta.php,但类似的127.0.0.1/project/alfa 不能重写为127.0.0.1/project/folder/alfa.php

标签: php regex url-rewriting url-routing


【解决方案1】:

您可以在/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]

【讨论】:

  • 绝对完美:)
【解决方案2】:

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

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

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

注意:我认为地址是 ipv4

【讨论】:

  • 谢谢!我去看看
【解决方案3】:

根据您对问题的评论中的澄清 - 仅通过 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,以查找与您的屏蔽 URL 的第二部分(alfa / beta 部分)匹配的所有 php 文件。如果只找到一个文件,则需要它才能运行它。

【讨论】:

  • 文件夹深度只有2,即文件夹和子文件夹,每个文件夹中的所有文件都是唯一的。如果这样更容易
猜你喜欢
  • 2023-04-03
  • 2016-10-27
  • 2015-08-02
  • 2013-03-14
  • 1970-01-01
  • 2020-09-06
  • 2012-05-12
  • 1970-01-01
  • 2023-03-09
相关资源
最近更新 更多