对于Apache URL重写的调试,一直是比较头疼的问题,因为在服务器端并且没有debug工具。网上流行的方法就是用rewrite的日志文件,给virtualhost添加如下设置:
#Rewrite Log RewriteLog logs/drupal001.com-rewrite.log #此处可以写绝对地址 RewriteLogLevel 3 |
这样可以在Apache默认的日志文件的地方,(一般是/var/log/httpd/),如此以来,可以通过tail -f 的方式来刷新日志文件观察apache URL重写的基本过程。
但是这样的调试有很多弊端,
- Apache的RewriteLog指令只能在conf文件中,不能在.htaccess文件,所以必须具有root用户权限,并且修改后需要重启apache,对调试代理复杂性。
- 默认的日志位置 /var/log/httpd 也只能有root用户才能访问。
- 由于一次刷新网页的请求很多(如很多图片、js的请求),导致日志文件比较凌乱,查看也比较困难。
笔者在Drupal论坛里偶然发现一个比较特殊的方法,这种方法调试Apache URL Rewrite比较简单,此方法只需要在.htaccess即可完成调试。
其一,在.htaccess的 RewriteEngine on 后面添加如下代码
#Should use vardump in Query RewriteCond %{QUERY_STRING} vardump RewriteRule (.*) http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI} [R=301,L,QSA] |
这样,如果要调试某些变量,只需要在URL中加入vardump的query即可。
如:http://www.drupal001.com/?vardump
就会跳转到baidu.com,从URL后面的Query即可得到某些参数的值。
这里列出来Apache默认的一些变量
#Apache variables HTTP_USER_AGENT HTTP_REFERER HTTP_COOKIE HTTP_FORWARDED HTTP_HOST HTTP_PROXY_CONNECTION HTTP_ACCEPT REMOTE_ADDR REMOTE_HOST REMOTE_PORT REMOTE_USER REMOTE_IDENT REQUEST_METHOD SCRIPT_FILENAME PATH_INFO QUERY_STRING AUTH_TYPE DOCUMENT_ROOT SERVER_ADMIN SERVER_NAME SERVER_ADDR SERVER_PORT SERVER_PROTOCOL SERVER_SOFTWARE TIME_YEAR TIME_MON TIME_DAY TIME_HOUR TIME_MIN TIME_SEC TIME_WDAY TIME API_VERSION THE_REQUEST REQUEST_URI REQUEST_FILENAME IS_SUBREQ HTTPS |
这样就可以轻松的打印出某些具体变量的值,以便检查我们的设置是否正确。
其二,我们可以单独使用下面一行代码
#Goto baidu RewriteRule (.*) http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI} [R=301,L,QSA] |
把这行代码放到我们想要的RewriteRule的前面,如果我们的RewriteCond验证成功,则当前URL就可以被跳转,否则,不跳转。这样可以轻松的检查我们书写的RewriteCond是否正确。
此方法虽然没有检查Log文件那样正规,但是实用也易用,不失为一种调试URL重写的好办法。
声明: 本站所有文章欢迎转载,所有文章未说明,均属于原创,转载均请注明出处。
原文链接: http://www.drupal001.com/2012/05/apache-rewrite-url-debug/