【问题标题】:Website deep folder structure urls, but with all files kept at a shallow level folder网站深层文件夹结构 url,但所有文件都保存在浅层文件夹中
【发布时间】:2015-01-19 11:18:39
【问题描述】:

我正在开发一个小型网络应用程序,用于输出属性(房屋、酒店或其他)的详细信息。应用程序的 url 当前在查询字符串中具有客户端和属性的 id,然后当用户浏览属性时,会修改哈希标记以表示当前正在查看属性的哪个部分,例如:

www.mydomain/myappfolder/?client=c0123&property=p001234#area=01

但是,我不想再使用查询字符串了,我想放弃并使用易于阅读和对 SEO 更友好的网址,让它们看起来像例如

www.mydomain/myappfolder/myclientsname/propertyname/#area=01

然后应用程序将解析 url 文件夹路径而不是查询字符串以输出正确的内容。

我担心的是,当访问这样格式的 url 时,服务器希望在深层文件夹结构的末尾找到一个文件,并且将文件添加到所有这些深层文件夹会使文件难以保持时间。

所以我的问题是:有谁知道我可以使用这样的深层文件夹结构 url,同时仍将所有应用程序的文件本身保持在较浅的 myappfolder/ 级别?

我想保持 url 在浏览器和我的网络统计中显示,所以我想尽可能避免页面重定向。

如果无法做到这一点,任何人都可以提出我需要在深层文件夹结构末尾放置一个文件的最低要求,以便将更新保持在最低限度。我认为这需要某种服务器端母版页类型系统,并且需要指向应用程序本身所在的路径。

为了增加复杂性,因为一些客户端有自己的子客户端,并且某些属性有时按位置或按项目分类,不同的客户端可能需要具有不同数量的子文件夹级别,因此我们也可以有例如

www.mydomain/myappfolder/myclientsname/theirclientsname/townname/propertyname/#area=01

另外,我正在尝试编写代码以使其适用于所有情况,但该应用程序可以由客户自己托管。这意味着他们可以把它放在他们想要的地方,并在未来的某个时间移动它,所以我不知道在编写代码时应用程序将被放置在他们自己网站的文件夹结构中的什么位置。

这两个细节意味着我很难将代码写在 deep 文件夹中的页面上,该页面指向 appfolder 所在的位置,因为 deep 文件夹中的页面不知道它的相对深度到应用程序,所以很难使用某种../../ 路径。此外,它不知道 appfolder 相对于网站根目录的位置,因为客户端可以将 appfolder 放在他们想要的任何位置。

这可以通过让客户修改位于其站点根目录中的配置文件来完成,但我宁愿避免这样做,因为将来很容易出错,并且我宁愿避免污染客户端的域根。

或者我可以编写解析 url 的代码,以尝试通过检测应用程序的名称来读取应用程序文件夹的位置。但是,我们希望 appfolder 的名称必须是简单的英文和强大的 SEO 关键字,因此该名称可能与客户名称或其项目名称或属性名称或其他名称重复的风险很小。所以我想不出一种方法来完全确定 url 解析器已经掌握了正确的文件夹。

非常感谢您抽出宝贵时间阅读本文,即使您无能为力。

更新 1:

好的,到目前为止,所有回复都非常有帮助地建议使用重写规则(我还没有经验),我已经阅读过,这似乎是一个很好的前进方式,我接受我将必须重写为查询字符串。所以...

www.mydomain/myappfolder/myclientsname/propertyname/

...在我的情况下将被重写为...

www.mydomain/myappfolder/?property=myclientsname/propertyname/

为了避免修改域根 .htaccess 文件,我想将它放在 myappfolder/ 的根目录中。

但是,如上所述,我不知道 myappfolder/ 将位于何处,因此我需要创建一些不会将重写目标定义为静态相对于域根目录的位置的东西,因为它可能位于子文件夹或更深的文件夹中。例如,有没有办法将它写成相对于找到 .htaccess 文件的位置?

另外,由于 myappfolder/ 将包含 libs/ js/ 等的物理子文件夹,任何人都可以帮助说明如何避免这些被重写?

【问题讨论】:

  • 我认为这通常是在服务器上使用重写规则来完成的。
  • 您可以使用 URL 重写将 URL(现有或其他)映射到物理文件。

标签: url mod-rewrite url-rewriting directory


【解决方案1】:

好的,如果我的理解正确,您希望保持 URL 简短,同时保持文件井井有条。我会建议一个 mod-rewrite 和一个数据库。

RewriteRule ^(.*)/(.*)/(.*)/$ /myappfolder/?client=$1&subClient=$2&id=$3 [L]
RewriteRule ^(.*)/(.*)/$ /myappfolder/?client=$1&id=$2 [L]

所以这将采用这样的 URL:

/appfolder/JaneDoe/p1234
/appfolder/JaneDoe/JimmyJones/p1234

然后发送到

/myappfolder/?client=JaneDoe&id=p1234
/myappfolder/?client=JaneDoe&subClient=JimmyJones&id=p1234

为了简短起见,我使用了不同的名称。

那么,我假设你最后不想要长数字,所以为每个主要客户建立一个数据库,并为他们和他们的客户建立表格。

之后的简单查询

更新:

SELECT * FROM 'JaneDoe'.'main' WHERE id='p1234'
SELECT * FROM 'JaneDoe'.'JimmyJones' WHERE id='p1234'

然后这些结果会返回您需要的任何内容,例如深层文件夹的路径。

我还建议创建一个简单的 CMS 系统来管理它,这样您就不必担心不同区域之间的拼写错误或其他任何事情。

希望这可以帮助您入门。

顺便说一句,我认为我的 SQL 语法已关闭。考虑一下那个伪代码。

** 更新:**

这是对 Mod_rewrite 的扩展

RewriteRule ^(.*)/(.*)/$ /myappfolder/?client=$1&id=$2 [L]

每个(.*) corresponds to a number, there are two, which is where$1and$2`都来自于。

^ 表示开始
$ 表示结束
通过将它们放在四肢上,它可以防止“中间”匹配。

[L] 表示这是最后处理的规则。您可以考虑将其设为[L,NC],以便您的网址不区分大小写。

那么,您将如何根据您的编辑进行更改?

RewriteRule ^myappfolder/(.*)/(.*)/$ /myappfolder/?property=$1/$2/ [L]

您可以在此处阅读有关 HTACCESS 的内容:

http://www.branded3.com/blogs/htaccess-mod_rewrite-ultimate-guide/

【讨论】:

  • 嗨,大卫。感谢您的回复。它帮助我理解这是我需要遵循的路径,但有几个问题我不确定它是否解决。我在我的文本中添加了一个更新,以试图让我的目标更清晰,并突出剩余的问题。大卫
  • @David,查看我的更新。我还提供了 htaccess 修改的参考链接。
猜你喜欢
  • 2022-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
相关资源
最近更新 更多