【问题标题】:Handling page views with htaccess and php使用 htaccess 和 php 处理页面视图
【发布时间】:2011-08-15 17:16:39
【问题描述】:

目前我正在附加以下 url 参数:

www.somesite.com/?page_type=view

我的 php 脚本使用它来确定要加载的页面视图:

if (isset($_GET['page_type'])) {
    $page_type = $_GET['page_type'];
    $this->pageType($page_type);
} else {
    $this->home();
}

我希望能够使用以下网址来实现相同的目标:

www.somesite.com/view

所以我需要将所有请求重定向到 index.php,同时保持原始 url 输入。

那我就可以用了

$_SERVER['REQUEST_URI']

获取页面视图的名称。

寻找一些 htaccess 建议,

提前致谢!

【问题讨论】:

    标签: php .htaccess mod-rewrite


    【解决方案1】:

    您可以使用以下内容:

    <IfModule mod_rewrite.c>
    RewriteEngine On
    #RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ /index.php?url=$1 [QSA,L]
    </IfModule>
    

    这会将所有未解析为实际文件/目录的请求重定向到您的index.php?url=$1 将包含请求,但在您的情况下这可能是可选的,因为您仍然可以从 $_SERVER['REQUEST_URI'] 获取它。

    我在其中留下了 RewriteBase 行(已注释掉),因为取消注释可以帮助设置服务器。

    【讨论】:

    • 感谢您的解决方案和解释。我认为布赖恩首先到达那里(希望接受这两个答案)。
    【解决方案2】:

    您的另一个选择是简单地设置您的 htaccess 文件以将任何 404(不可解析)请求重定向到索引文件,并设置如下标志:

    RewriteEngine on
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule . index.php?sef_rewrite=1 [L,QSA]
    

    从这里您可以使用 PHP 对 $_SERVER['REQUEST_URI'] 信息的访问来解析 PHP 中的内容,并根据需要手动将变量推送到 $_REQUEST 超全局变量中,以将您的搜索引擎友好链接“映射”到应用程序中。

    与简单地在所有 url 上强制使用 /pagetypevar 格式相比,这为您提供了更多的可扩展性。

    当您想将页面嵌套到子类别中时会发生什么? /info/about_us, /info/contact_us 如果您想在 url 中存储其他变量(如每页项目或分页)会​​发生什么? /products/1_My_supercool_item, /products/2_Another_item

    使用将所有未解决的请求重定向到应用程序框架的系统,并允许应用程序框架重新映射 url,这将为您提供最大的控制权和最大的可扩展性。

    【讨论】:

    • 非常感谢,完美运行。感谢有关灵活性/可扩展性的建议。原来我的 godaddy 共享主机还有另一个问题,其中 htaccess 文件位于超过 2 级深的目录(从根目录)中不起作用。可能是时候寻找新的托管服务提供商了。
    • 这实际上是服务器过载的主机的常见问题。通过将 apache 配置为使用浅 htaccess 支持,他们可以在服务器上塞进一些额外的站点,以免降低性能。如果您正在寻找比 Godaddy 更灵活但价格不会大幅上涨的人,我可能会建议 hostgator.com。我以前用它们托管过一次性服务器/站点,因为它们具有很大的灵活性,而且没有附加巨额成本;)
    【解决方案3】:

    使用这样的重写规则:

    RewriteEngine On
    RewriteRule /(home|view) index.php?page_type=$1
    

    【讨论】:

      【解决方案4】:
      RewriteEngine On
      RewriteCond %{REQUEST_FILENAME} !-d
      RewriteCond %{REQUEST_FILENAME} !-f
      RewriteRule /^(.*)$ /index.php?page_type=$1 [L]
      

      【讨论】:

      • 感谢您的回答。不得不把它交给布莱恩以获得额外的建议。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      相关资源
      最近更新 更多