【问题标题】:Rewrite the url of a website living in a subdirectory with .htaccess使用 .htaccess 重写位于子目录中的网站的 url
【发布时间】:2020-05-30 21:37:28
【问题描述】:

我目前正在编写一个网站,简而言之,它通过 url 参数和 php 包含动态加载其内容。该网站位于根目录下名为“saischek”的子文件夹中。

url 有一个可选参数:page,因此 url 可以如下所示:

localhost/saischek/index.php?page=accounting
localhost/saischek/index.php

我希望我的网址看起来像这样:

localhost/saischek/accounting
localhost/saischek/home <- if the url parameter _page_ isn't given

我的 .htaccess 文件目前位于子目录“saischek”中,如下所示:

RewriteEngine on
RewriteRule ^saischek/([a-zA-Z0-9_-]+)$ saischek/index.php?page=$1

该网站在 apache 网络服务器上运行,“httpd.conf”文件中的所有必要更改都已完成并正常工作。

【问题讨论】:

  • 那么如果在请求的 URL http://localhost/saischek/home 中只有两个参数中的一个被“声明”了,那么会发生什么?逻辑应该如何决定什么是“文件夹”或“页面”?
  • 这个想法是 index.php 文件根据给定的两个参数“文件夹”和“文件”决定将哪些内容加载到 html 中。因此,如果仅声明“文件”,我有一个包含,它在“saischek”文件夹中搜索该文件并包含它。如果只给出“文件夹”,它会在“saischek”中查找文件夹并加载其 index.php 文件。如果两者都给出,它会加载声明的文件夹文件。如果没有给出“文件夹”和“文件”,它会加载一个名为“home.php”的文件。代码运行良好,只是重写为更好的 url 不起作用。
  • 你没有回答我的问题...
  • 对不起,我不完全理解你的问题。 “逻辑应该如何决定“文件夹”或“页面”的含义是什么意思?正如所写的那样,逻辑是一个 php 脚本,它知道如何处理这两个 url 参数“页面”和“文件夹”以及如何将内容包含到 html 中。
  • 您自己的描述包含这样的内容:“localhost/saischek/accounting 一个 URL:文件夹页面。从 URL 的语法来看,不清楚它是哪一个。那么重写逻辑应该如何知道呢?在您自己的示例中,“会计”是文件夹还是页面?

标签: php apache .htaccess mod-rewrite url-rewriting


【解决方案1】:

我想说,在 cmets 中对该问题的讨论以及您对问题的修订,您几乎就在那里,您自己找到了解决方案...

我建议稍微更改主要规则,您还需要处理您提到的“主页”页面

RewriteEngine on
RewriteCond %{REQUEST_URI} !/saischek/index\.html$
RewriteRule ^/?saischek/home/?$ /saischek/index.php [QSA,END]
RewriteRule ^/?saischek/([a-zA-Z0-9_-]+)/?$ /saischek/index.php?page=$1 [QSA,END]

但是我想知道你为什么要使用“home”slug,为什么不简单地使用https://example.org/saischek 而不是https://example.org/saischek/home?在这种情况下,您可以尝试以下变体:

RewriteEngine on
RewriteCond %{REQUEST_URI} !/saischek/index\.html$
RewriteRule ^/?saischek/?$ /saischek/index.php [QSA,END]
RewriteRule ^/?saischek/([a-zA-Z0-9_-]+)/?$ /saischek/index.php?page=$1 [QSA,END]

如果您使用上述规则收到内部服务器错误(http 状态 500),那么您很可能操作的是非常旧版本的 apache http 服务器。在这种情况下,您将在 http 服务器错误日志文件中看到不支持的 [END] 标志的明确提示。您可以尝试升级或使用旧的[L] 标志,在这种情况下它可能会起作用,尽管这取决于您的设置。

此实现同样适用于 http 服务器主机配置或分布式配置文件(“.htaccess”文件)。显然重写模块需要在http服务器内部加载并在http主机中启用。如果您使用分布式配置文件,您需要注意它的解释在主机配置中完全启用,并且它位于主机的 DOCUMENT_ROOT 文件夹中。

一般来说:您应该始终喜欢将此类规则放在 http 服务器主机配置中,而不是使用分布式配置文件(“.htaccess”)。这些分布式配置文件增加了复杂性,通常是意外行为的原因,难以调试并且它们确实减慢了 http 服务器的速度。它们仅在您无法访问真正的 http 服务器主机配置(阅读:非常便宜的服务提供商)或坚持编写自己的规则的应用程序(这是一个明显的安全噩梦)的情况下作为最后一个选项提供。

【讨论】:

    【解决方案2】:

    尝试添加?并将 + 更改为 * 因为如果页面丢失,URL 将不会同时包含它们..(/ 和页面)。

    ^saischek/([a-zA-Z0-9_-]+)/?([a-zA-Z0-9_-]*)$

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 1970-01-01
      • 2014-01-27
      • 2010-10-26
      • 2015-02-03
      • 1970-01-01
      • 2016-10-13
      • 2018-04-05
      • 1970-01-01
      相关资源
      最近更新 更多