没有 mod_rewrite 的漂亮 URL,没有 .htaccess

Posted

技术标签:

【中文标题】没有 mod_rewrite 的漂亮 URL,没有 .htaccess【英文标题】:Pretty URLs without mod_rewrite, without .htaccess 【发布时间】:2010-11-01 19:04:04 【问题描述】:

由于无法访问 .htaccess,我发现自己陷入了创作僵局。 没有适合我的 mod_rewriting。 不过,我希望能够做一些不错的事情,例如:

http://www.example.com/Blog/2009/12/10/
http://www.example.com/Title_Of_This_Page

我的替代方案是什么?

回应答案:

我正在使用 php5 构建 我无权访问 .htaccess http://www.example.com/index.php/Blog/ 是一种已知技术,但我不喜欢它。可以这么说就是显示php。 如何创建无扩展名的 PHP 文件?这样可以解决问题吗? 使用自定义 404 技术对性能的影响有多大?

【问题讨论】:

哪个网络服务器?或者,您是在问如何在 IIS 上获取无扩展名的 PHP url? 无扩展 PHP 会产生同样的错觉,对吧?另一方面,我猜 /Blog/2009/12/10 行不通? 【参考方案1】:

如果启用了MultiViews 选项,或者您可以说服持有密钥的人启用它,您可以创建一个名为 Blog.php 的脚本,该脚本将向example.com/Blog/foo 传递请求并在@ 中获取'/foo' 987654323@.

【讨论】:

是的,我现在明白了。已编辑。【参考方案2】:

如果您有权为您的服务器设置自定义错误文档,您可以使用它来重定向 404 请求。

例如对于 Apache (http://httpd.apache.org/docs/2.0/mod/core.html#errordocument)

ErrorDocument 404 /index.php

在 index.php 中,您可以使用 $_SERVER 数组中的数据来处理您的请求。

【讨论】:

啊,打败我了。我考虑了 5 分钟,最后得出了同样的结论。 返回的文档仍然是 HTTP 404 状态,而不是 200。这会给网络爬虫带来很多问题。 @chaos: 您不能 POST(即可以,但数据会丢失)到错误文档脚本。 @Maciej Łebkowski:这应该不是问题,因为客户通常不会自己发帖给你(你说什么时候发给哪个资源)。【参考方案3】:

一个非常简单的方法是:

.htaccess 中声明一个 404 错误文档(例如 PHP) 使用$_SERVER解析查询并查看它是否对应任何结果 如果是这样,使用 header() 将 HTTP 状态 404 替换为状态 200 并包含 index.php

【讨论】:

问题又变成了,如何在没有 .htaccess 的情况下做到这一点。不过,一些虚拟主机确实在其配置中提供了自定义 404,因此这是可能的。 对。如果无法选择(或编辑)您的 404 ErrorDocument 或使用 .htaccess,我看不到任何解决方案,因为您必须在请求处理级别进行设置......或者使用您不喜欢的解决方案:index.php/Blog/...【参考方案4】:

你也可以有类似的网址

http://domain.com/index.php/Blog/Hello_World

PHP5 开箱即用。然后,您可以使用

读取 URL 参数
echo $_SERVER['PATH_INFO'];

在您的应用程序中使用它们之前,请记住验证/过滤 PATH_INFO 和所有其他请求变量。

【讨论】:

我知道这种技术。我改变了要求没有这种方法的方法的问题。尽管如此,这是一个替代方案,所以你是对的。我只是不喜欢这个。【参考方案5】:

唯一的方法是使用自定义 404 页面。如果不重新配置 Web 服务器的 MIME 类型,您将无法使用 PHP 解释器解释无扩展名文件。但是你说连.htaccess都不能编辑,所以没办法。

【讨论】:

【参考方案6】:

如果您省略尾部斜杠,Apache 将提供与该名称匹配的第一个文件 [按字母顺序],无论扩展名如何,至少在我有权访问的 2 台服务器上。

我不知道您如何使用它来解决您的问题,但它可能在某些时候有用。

例如,如果 http://www.somesite.com/abc.htmlhttp://www.somesite.com/abc.php 都存在并且http://www.somesite.com/abc 被请求,http://www.somesite.com/abc.html 将被提供。

【讨论】:

您指的是 apache 中的选项 MultiViews。此选项可能会产生不必要的副作用。 httpd.apache.org/docs/current/mod/mod_negotiation.html【参考方案7】:

您可以编写一个 URI 类来解析您定义的用户友好的 URL。

【讨论】:

【参考方案8】:

我知道这个问题已经很老了,但我没有看到其他人提出这个可能的解决方案......

只要在 URL 的域部分后面加一个问号就可以非常接近你想要的,即;

http://www.example.com/?Blog/2009/12/10/
http://www.example.com/?Title_Of_This_Page

以上两个 HTTP 请求现在都将由同一个 PHP 脚本处理;

www.example.com/index.php

而在index.php脚本中,上面两个页面的$_SERVER['REQUEST_URI']将分别为;

Blog/2009/12/10/

Title_Of_This_Page

所以你可以随心所欲地处理它们。

【讨论】:

我实际上只是实现了类似的东西,发现单个问号可以很好地调用 index.php 页面,而不会将其暴露为处理程序。它不是那么干净,但它仍然可以在无需配置 Web 服务器重写规则的情况下工作。

以上是关于没有 mod_rewrite 的漂亮 URL,没有 .htaccess的主要内容,如果未能解决你的问题,请参考以下文章

mod_rewrite:删除尾部斜杠(只有一个!)

mod_rewrite:将路径和查询字符串 URL 作为参数传递

如何在没有 mod_rewrite 的情况下重定向除一个路径及其所有子路径之外的所有 URL?

一些没有.php扩展名的页面Mod_rewrite

mod_rewrite:从 URL 中删除查询字符串?

mod_rewrite:无法访问真实文件和目录