htaccess - 创建同名的目录和文件

时间:2012-06-23 23:05:40

标签: .htaccess mod-rewrite directory subdirectory

我想在最后创建一堆没有扩展名的文件。最简单的方法是这样做:

/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个文件,而不是包含1个文件的1000个目录。

拜托,有人能指出我正确的方向,并知道我正在为所有50个州做这件事。

吉姆

2 个答案:

答案 0 :(得分:1)

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

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]

答案 1 :(得分:0)

如何只创建一个文件:

/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有更好的解决方案,不知道。 :)