【问题标题】:htaccess - creating directories and files of the same namehtaccess - 创建同名的目录和文件
【发布时间】:2012-06-25 18:51:48
【问题描述】:

我想创建一堆文件,最后不显示扩展名。最简单的方法是这样做:

/usa/index.php
/usa/alaska/index.php
/usa/alabama/index.php
/usa/california/index.php

我想做的是这个

/usa/alaska.php
/usa/alabama.php
/usa/california.php

并让它显示为:

/usa/alaska
/usa/alabama
/usa/california

不过,我还想再添加一层,城市

/usa/alaska/adak.php
/usa/alaska/anchorage.php
/usa/california/los-angles.php

我不希望“.php”出现,但是每个状态都作为文件和目录存在。我想要的是一个 htaccess 规则,它提供文件的文件版本,而不是默认的目录。我还想从文件末尾剥离 .php,这样最终结果看起来像

/usa 
/usa/alaska (alaska.php)
/usa/alaska/adak  (adak.php)

我知道我可以通过创建所有目录并为每个目录使用 index.php 来接近这一点,但是我将拥有数千个目录,每个目录都有一个文件,并且更新是一件麻烦事。我宁愿一个目录里面有 1000 个文件,而不是 1000 个目录里面有 1 个文件。

请有人指出我正确的方向并知道我正在为所有 50 个州这样做。

吉姆

【问题讨论】:

  • 你真的需要一个单独的php 文件为每个州和一个州的每个城市吗?

标签: .htaccess mod-rewrite directory subdirectory


【解决方案1】:

我还建议使用单个 php(例如 index.php)文件并将所有以 usa 开头的 url 重定向到它,而不是将它们分隔在不同的目录和文件中。你需要几个重写规则,如下所示

RewriteEngine On
RewriteRule ^usa/([^/.]+)$ index.php?state=$1 [L]
RewriteRule ^usa/([^/]+)/([^/.]+)$ index.php?state=$1&city=$2 [L]

那么在你的index.php 中你只需要检查$_GET 参数。

更新:
如果您对使用数据库并从那里提取所需数据感到不舒服,您始终可以使用参数来动态包含/需要所需的文件。像这样的

<?php
    $source = ''; //or the 'ROOT' directory
    if(isset($_GET['state'])) $source .= $_GET['state'].'/';
    if(isset($_GET['city'])) $source .= $_GET['city'].'.php';
    include($source);  // here $source would be something like 'alaska/adak.php'
                       // and is assumed that the dir 'alaska' is on the same 
                       // level as 'index.php'
?>

但是要回答您的原始问题,您仍然可以使用以下.htaccess

RewriteEngine On
RewriteRule ^usa/([^/.]+)$ usa/$1.php [L]
RewriteRule ^usa/([^/]+)/([^/.]+)$ usa/$1/$2.php [L]

【讨论】:

  • Havelock,这意味着我必须上传我的数据库并动态创建我的页面。我不确定我是否具备 PHP 的技能来做到这一点。我更容易创建一个包含所有变量的 php 文件并将其存储在计算机上。
  • @JimCubbageJr 那是一种可能性。另一种方法是根据statecity 参数动态包含(显示)html/php 文件。
  • @JimCubbageJr 我更新了我的答案,现在完全符合你的问题:)
  • 谢谢,昨晚我也有类似的想法,它会提取正确的文件。最终,我可以扩展文件以从数据库中动态提取,但此时我想包括,在这种情况下,CubeCart 的数据库缓存。实际上,这就是我在这里所做的,一个穷人的缓存。
  • 注意:对原始问题的回答不完整。我试过你说的,问题是如果alaska.php和/alaska/都存在,它总是将目录服务到浏览器,而不是文件。
【解决方案2】:

只创建一个文件怎么样:

/usa/index.php

$_SERVER["REQUEST_URI"]

您可以读取当前的 URI。 好吧,现在如果用户输入“http://domain.foo/usa/alaska”,他当然会得到 404 错误。 但是要改为调用您的index.php,您可以将此行写入.htaccess

ErrorDocument 404 /usa/index.php

现在index.php 接收写入 URI 的所有内容,您可以匹配结果并包含文件或处理错误。

但也许只有 .htaccess 有更好的解决方案,不知道。 :)

【讨论】:

  • 我将不得不检查该解决方案,但我认为搜索引擎会在标题链中看到 404 并使下面的每个页面无效。
  • 但即便如此,它并没有让我超越我当前尝试访问 /usa/alaska(删除扩展名的 alaska.php)文件的问题,而不是让网络服务器显示 / 的目录美国/阿拉斯加/。
猜你喜欢
  • 2011-01-02
  • 1970-01-01
  • 2016-01-05
  • 2012-03-11
  • 2013-11-18
  • 1970-01-01
  • 2011-01-15
  • 1970-01-01
  • 2012-01-01
相关资源
最近更新 更多