【问题标题】:hide (remove) folder names in URL rewrite Rules Not working在 URL 重写规则中隐藏(删除)文件夹名称不起作用
【发布时间】:2021-12-26 01:17:41
【问题描述】:

我想使用 htaccess 删除文件夹名称来创建干净的 URL,并且我有多个文件夹(食物、健康、美容......)重写规则不起作用

       site.com/food/one.php

       TO

        site.com/one.php

食物文件夹规则 重写引擎开启

     <IfModule mod_rewrite.c>

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

 </IfModule>

健康文件夹规则

     <IfModule mod_rewrite.c>
          RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.+)$ /health/$1 [NC,L]
   
      </IfModule>

美容文件夹规则

      <IfModule mod_rewrite.c>
          RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.+)$ /buety/$1 [NC,L]
   
      </IfModule>

只有一个规则可以正常工作(仅限顶级规则......无论它可能是什么)其余规则不行 工作,内部服务器错误 500

请帮帮我

【问题讨论】:

  • 你的三个规则在它们匹配的内容上是相同的,所以第一个获胜。他们都说“无论输入什么,都前进到下一个文件夹”,但只能是其中一个。您需要在 htaccess 或 PHP 中找到一种方法来说明“诸如 a 之类的 URL 应该转到 food 文件夹,而诸如 b 之类的 URL 应该转到健康文件夹。“例如”是你的逻辑。在 htaccess 中更难做,所以我建议查看 PHP 路由

标签: php apache .htaccess mod-rewrite


【解决方案1】:

假设您的所有规则块在根 .htaccess 文件中一个接一个。

其余规则不起作用,出现内部服务器错误 500

因为不管目标文件是否存在,你都是无条件地重写到/food/子目录(因为这个规则是第一的)。如果它不存在,它将创建一个重写循环,从而导致 500 Internal Server Error 响应。

仅当请求已经映射到文件(或目录)时才处理剩余的规则,但是前面的 RewriteCond 指令会阻止规则执行任何操作(因为已经确定请求映射到文件或目录)。

如果 URL 没有明显差异,则需要在重写请求之前检查目标文件是否存在。

您可以这样做,但有一个明显的警告是,您不能在多个子目录中拥有相同的文件名(第一个将始终“获胜”)。我们还需要做一些假设……

  1. 您正在重写对物理 .php 文件的请求(根据您的示例)。
  2. .php 出现在 URL 中(根据您的示例)。

请尝试以下方法:

RewriteEngine On

# If the request is already for one of the subdirectories then stop here
RewriteRule ^(food|health|beauty)($|/) - [L]

# If the request is for anything other than a ".php" file then stop here
RewriteRule !\.php$ - [L]

# If the request already maps to a file (or directory) then stop here
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]

# Rewrite to "/food" if the target file exists
RewriteCond %{DOCUMENT_ROOT}/food/$0 -f
RewriteRule .+ food/$0 [L]

# Rewrite to "/health" if the target file exists
RewriteCond %{DOCUMENT_ROOT}/health/$0 -f
RewriteRule .+ health/$0 [L]

# Rewrite to "/beauty" if the target file exists
RewriteCond %{DOCUMENT_ROOT}/beauty/$0 -f
RewriteRule .+ beauty/$0 [L]

不需要&lt;IfModule&gt; 包装器或RewriteBase 指令。

虽然您想从 URL 中删除这些子目录似乎有点奇怪,因为它们看起来像“关键字”,最好留在 URL 中?

【讨论】:

  • 出现 404 错误(找不到文件)
  • @coder2022 你要什么网址?目标文件在哪里?
  • @coder2022 你好?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2021-09-11
  • 2014-12-07
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 2022-11-25
相关资源
最近更新 更多