0

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

/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 个州做这件事。

吉姆

4

2 回答 2

1

我还建议使用单个 php(例如index.php)文件并将所有以它开头的 url 重定向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]
于 2012-06-25T08:29:11.200 回答
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 有更好的解决方案,不知道。:)

于 2012-06-23T23:25:53.037 回答