我想问的是,是否有办法找出Web服务器实例是否启用了URL重写.我需要这个,以便能够实例化正确类型的URL处理程序.
从理论上讲,如果你启用或不启用它,你事先就知道了,可以用它来配置它.但是,我希望能够在运行时自动检测此设置.
URL重写规则将非常简单,如:
^/(.*)$ => /bootstrap.php
这可以保证REQUEST_URI中存在相关字符串,但不会污染_GET数组.
到目前为止,我的研究对我有何看法:
Apache的.
在我看来,Apache有一个非常古怪的方法,因为它设置了REDIRECT_SCRIPT_URI
重写URL 的标题,但不是那些没有重写的标题.
例如
http://host/ana/are/mere将被重写为index.php所以前面的标题会出现,但是
http://host/不会重写.
Lighttpd的.
具有fast-cgi的Lighttpd表现良好,如果为当前主机启用了URL Rewrite,则设置REDIRECT_URI标头.这很可靠.
切诺基.
好吧,对于切诺基来说,我找不到任何方法,因为它使用(在我看来)一种更复杂的方法来获取URL重写.(即,它被称为内部重定向 - 并且fcgi进程不知道请求被重定向)
另外我没有测试过其他http服务器,如nginx,所以如果有人对此事有一些意见,我很乐意听到.
不是最优雅的解决方案,但你可以创建一个目录,插入一个.htaccess和一个小的php文件,并尝试用你的实际代码中的curl/file_get_contents()打开它:
的.htaccess
RewriteEngine on RewriteRule ^(.*?)$ index.php?myparam=$1
的index.php
虽然在安装过程中这可能是可以接受的,但出于性能原因,这不应该用于您网站上的每个请求!将信息保存在某处(sqlite/textfile).
更新
特定于Apache,但apache_get_modules()
/ phpinfo()
与array_search/strpos结合使用可能对您有所帮助.
它已经在下面提到了,但我相信下面的配方对这个问题是一个相当防水的解决方案:
设置重定向
通过重写的URL请求页面
如果请求返回有问题的页面,则表示您已正确设置重定向,如果获得HTTP 404响应,则表明它无法正常工作.
基本上,这个想法适用于任何重定向方法.它已经被提及,但是值得重申,这些技巧增加了相当多的开销,并且只能执行一次(安装或从设置面板),然后保存在设置中.
一些实现细节,选择以及我对此解决方案的看法:
我记得Drupal在安装过程中做了这样的检查,所以我查看了他们是如何做到的.他们在安装页面上的javascript做了一个ajax请求(同步,以防止与数据库的并发问题).这要求安装软件的用户打开javascript,但我认为这不是一个不合理的要求.
但是,我确实认为使用php来请求页面可能是一个更清洁的解决方案.除了不需要javascript要求之外,它还需要来回传输更少的数据,并且不需要将操作的逻辑分布在多个文件上.我不知道这两种方法是否还有其他(dis)优势,但这应该让你去,让你自己探索替代选择.
还有另一种选择:是在测试环境中还是在正常站点上进行测试.Drupal所做的事情就是让重定向始终打开(例如在apache的情况下,让重定向的.htaccess文件只是Drupal下载的一部分)但是只有在重定向打开时才写入花哨的url设置.这样做的缺点是需要更多的工作来检测使用哪种类型的重定向,但仍然可以(例如,您可以在特定的测试页面或甚至每个页面上添加显示重定向引擎的GET变量,或者您可以重定向到设置$redirectionEngine
然后包含真实索引的页面.虽然除了在apache上使用mod_rewrite之外我没有太多的重定向经验,但我相信这应该适用于几乎每个重定向引擎.
这里的另一个选择是使用测试环境.基本上,我们的想法是创建一个文件夹并为其设置重定向,或者删除对文件系统写访问的需要,而是拥有一个文件夹(或每个重定向引擎的文件夹).这有一些缺点:你仍然需要写访问权来设置主站点的重定向(虽然可能不是所有的重定向引擎,我真的不知道你们是如何正确设置它们的 - 但是对于apache你需要写访问权限如果要打开重定向),机器人可能更容易通过访问测试来检测您正在使用的软件及其使用的版本(除非您在测试后删除测试文件夹)并且您需要能够仅重写网站的一部分(这对于任何重定向引擎都是有意义的,但我并不是盲目地假设这个功能).然而,这确实带来了以下优点:更容易找出正在使用的重写引擎或基本上重定向的任何其他方面.可能还有其他我不知道的优点,所以我只是给出选项,让你自己选择你的方法.
有一些选项留给用户,我相信这应该可以帮助您以您喜欢的方式设置系统.
PHP具有针对Apache,IIS和NSAPI服务器的服务器特定功能.我只有Apache,但merkuro建议这可以按预期工作:
由于PHP服务器特定的功能未涵盖您要测试的所有服务器,因此这可能不是最佳解决方案.
我推荐merkuro的第一个答案 - 然后在脚本中进行测试.我相信这是获得好成绩的唯一途径.
希望有所帮助!