没有 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 构建 我无权访问 .htaccesshttp://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.html
和 http://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:将路径和查询字符串 URL 作为参数传递