htaccess:在提供原始内容时从 URL 中删除子目录

Posted

技术标签:

【中文标题】htaccess:在提供原始内容时从 URL 中删除子目录【英文标题】:htaccess: remove subdirectory form URL while serving up original content 【发布时间】:2012-02-11 17:41:55 【问题描述】:

我有这样的 URL 结构

http://domain.com/page/thing1
http://domain.com/page/thing2
http://domain.com/page/thing3

我想:

从 URL 中删除 /page/ 提供来自 /page/thing1 的内容

我正在使用 ExpressionEngine,所以这是我从 URL 中删除 index.php 的方法

<IfModule mod_rewrite.c>
        RewriteEngine On

        # Removes index.php
        RewriteCond $1 !\.(gif|jpe?g|png)$ [NC]
        RewriteCond %REQUEST_FILENAME !-f
        RewriteCond %REQUEST_FILENAME !-d
        RewriteRule ^(.*)$ /index.php/$1 [L]
</IfModule>

【问题讨论】:

您不一定必须通过 ModRewrite 执行此操作,具体取决于您在 EE 中访问此数据的方式。这些 URL 是通过 Pages 模块创建的吗?还是page 是模板组而thing1 是模板?或者是thing1thing2 等,所有条目的 URL 标题? 这里有两个帖子可能对***.com/questions/2402140/…和***.com/questions/990392/…有帮助 @DerekHogue 现在我已经设置好了,其中 page 是一个模板组,thing1 和 thing 2 是条目。 在这种情况下,see rjb's answer - Pages 模块是这里的方法。通过第一段通过 URL 标题访问单个条目不是一个好方法。 【参考方案1】:

这些新网址有什么好处?

简单地从您的 URI 中删除 /page URL 段(即模板组)会产生大量额外的开销和复杂性,如下面的ExpressionEngine URL Schematic 所示:

原生 ExpressionEngine Pages Module 或第三方 Structure Module 是最简单的方法,不需要在您的 .htaccess 文件中添加任何 RewriteRules 规则。

但是,这将要求您为每个条目创建一个页面 URL,这可能不太理想。

【讨论】:

【参考方案2】:

如果你把你所有的url都改成http://domain.com/thing1和http://domain.com/thing2等,你就不能在重写index.php文件的时候把page/加回来吗? p>

RewriteRule ^(.*)$ /index.php/page/$1 [L]

【讨论】:

这将假定 所有请求 将通过 /pages 模板组进行路由,这会破坏许多 URI — 包括许多核心 ExpressionEngine URL。至少,您必须将RewriteRuleRewriteCond 结合起来。【参考方案3】:

IfModule 块中的现有重写规则下方附加这些行:

RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME !-d
RewriteRule ^(?!page/)(.*)$ /page/$1 [L,NC]

【讨论】:

以上是关于htaccess:在提供原始内容时从 URL 中删除子目录的主要内容,如果未能解决你的问题,请参考以下文章

Yii2 301 从原始 url 重定向到 .htaccess 中对 SEO 友好的 url 不起作用,需要其他解决方案

ThinkPHP 利用.htaccess文件的 Rewrite 规则隐藏URL中的 index.php

SEO工具箱:PHP自动生成PHPCMS伪静态规则.htaccess

带有 htaccess 的 CakePHP 子域

.htaccess 搜索引擎和用户友好的 URL

RewriteRule 后如何在地址栏中保留原始 URL