[urlrewrite模块调试]如何调试Apache的URL重写,详解调试Apache的mod_rewrite模块,在线Apache重写规则测试工具介绍。apache下htaccess不起作用,linux,windows详解
背景:后知后觉之经过实践证明,其实,调试还是用print_r($_GET);好,见: https://jackxiang.com/post/1950/ ,辅助下正则猫:RegexBuddy,也就解决了90%的问题。
共计有三个方法来调试这个Urlrewrite:
一)调试apache的urlrewrite是个大问题,这儿有两个哥们的博文作了介绍,特转之。
在旧的Apache的httpd.conf里面是有这样的参数的:
但是在新版本的Apache中,已经取消了RewriteLog这个参数,如果你加上这个参数只会使你的Apache无法启动!新版本的Apache已经把Rewrite模块的日志也写到了Apache的error.log中,只需要我们制定一下输出的log的级别和trace的深度就好了,例如
LogLevel alert rewrite:trace3
这样可以在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 后面添加如下代码
这样,如果要调试某些变量,只需要在URL中加入vardump的query即可。
如:http://www.drupal001.com/?vardump
就会跳转到baidu.com,从URL后面的Query即可得到某些参数的值。
这里列出来Apache默认的一些变量
这样就可以轻松的打印出某些具体变量的值,以便检查我们的设置是否正确。
其二,我们可以单独使用下面一行代码
把这行代码放到我们想要的RewriteRule的前面,如果我们的RewriteCond验证成功,则当前URL就可以被跳转,否则,不跳转。这样可以轻松的检查我们书写的RewriteCond是否正确。
此方法虽然没有检查Log文件那样正规,但是实用也易用,不失为一种调试URL重写的好办法。
来源:
http://www.drupal001.com/2012/05/apache-rewrite-url-debug/
http://www.nigesb.com/debug-the-mod_rewrite-in-apache.html
.htaccess 修改用不用重启apache:
http://blog.sina.com.cn/s/blog_6e770c2d0100z6w9.html
Apache是一个高度可配置的web服务器,而.htaccess则是高度可配置的重要原因之一。设想一下,如果每一个用户都将自己的配置信息写在httpd.conf文件里,那复杂性和安全性都将是巨大的隐患。
Apache通过.htaccess实现了面向目录的分布式配置功能,通过.htaccess,我们可以为不同的目录定制不同的功能。比如:1)目录默认页面 2)自定义错误页面 3)页面重定向 4)页面访问权限 等等。而且,对于用户来说,修改httpd.conf后,需要重启Apache才能生效;而修改.htaccess文件无需重启Apache使之生效,这也是.htaccess的另外一个优势
二)老外的工具介绍:
调试Apache的url重写规则的时候没有任何的提示和辅助工具,结果也只有成功/不成功两种,这个设置估计会让很多人尝试url重写功能的时候会抓狂,今天无意中有国外友人提供了一个在线的Apache url 重写规则调试器,地址在此:
http://civilolydnad.se/projects/rewriterule/
你可以在页面上的规则框中输入你想调试的规则,然后在上面的url框中输入访问地址查看规则的运行情况
另外这个测试工具暂时功能有限只能测试RewriteRule,像高级点的RewriteCond、RewriteMaps、RewriteBase这些规则都不支持,所以剩下的那些高级功能还是要自己慢慢刷页面调试了。
来自:http://be-evil.org/?post=231
试例测试:
输入:
magento.scnjw.gov.cn/new/abc.html
Url规则填写:
RewriteEngine On
RewriteRule ^magento.scnjw.gov.cn/new/(.*)$ http://www.yiphone.info/default/$1
得到结果:
Resulting URL: http://www.yiphone.info/default/abc.html
# Match? Rule Resulting URL
1 yes RewriteRule ^magento.scnjw.gov.cn/new/(.*)$ http://www.yiphone.info/default/$1 http://www.yiphone.info/default/abc.html
三)再就是把这个url通过PHP来输出:
把$_SERVER数组输出查看,print_r($_SERVER);
来自:http://blog.zol.com.cn/2269/article_2268695.html
实践情况如下:
如这个Url,用这个老外写的工具就不行,于是得用第三)个方法,直接print_r($_SERVER)打印来调试Url:
video/index-hot-2.html
UrlRewrite为:
RewriteEngine On
RewriteRule ^video/(index|list)(-(hot|fav|comment|dig|new))?(-(day|week|month))?(-(\\d+))?(-(\\d+))?\\.html$ /index.php?c=rank&a=video&style=$1&index=$3&period=$5&category=$7&page=$9&max_age=1800
通过print_r($_SERVER);die;得到:
[REQUEST_URI] => /video/index-hot-2.html
[REDIRECT_QUERY_STRING] => c=rank&a=video&style=index&index=hot&period=&category=2&page=&max_age=1800
[QUERY_STRING] => c=rank&a=video&style=index&index=hot&period=&category=2&page=&max_age=1800
可能出现下面这三种的错误可能性:
第一种:启用 rewrite 和 .htaccess 设置
rewrite设置:找到apache的配置文件httpd.conf文件,找到:#LoadModule rewrite_module modules/mod_rewrite.so去掉前面的#号。
改为:LoadModule rewrite_module modules/mod_rewrite.so
.htaccess设置:
windows里面这样设置:AccessFileName htaccess
linux里面这样设置:AccessFileName .htaccess。
linux比windows里面文件名前面多了一个点。如果没找到AccessFileName自己在httpd.conf文件最后面加上。
第二种:AllowOverride 的设置。
默认AllowOverride 为AllowOverride none。把这个改为:AllowOverride All。如果配置了多个虚拟目录需在每个目录里面开启,实例:
<VirtualHost *:80>
DocumentRoot "D:SvnTracsvnSVNRepositorywwwroot"
ServerName 127.0.0.1:80
DirectoryIndex index.html index.htm index.php index.shtml
<Directory "D:SvnTracsvnSVNRepositorywwwroot">
Options Indexes FollowSymLinks
AllowOverride ALL
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost 127.0.0.2:80>
DocumentRoot "D:/SvnTrac/svn/SVNRepository/www/"
ServerName 127.0.0.2:80
DirectoryIndex index.html index.htm index.php index.shtml
<Directory "D:/SvnTrac/svn/SVNRepository/www/">
Options Indexes FollowSymLinks
AllowOverride ALL
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
第三种:Options 的设置
默认设置是:Options Indexes FollowSymLinks
如果改成以下设置后,就会出错
Options Indexes FollowSymLinks MultiViews Includes (出错)
如果要启用,目录浏览 MultiViews
服务器端包含 Includes (<!–#include virtual=”top.htm” –>)
为了简单可以设置为:Options All
前两种是配置中常见的错误,第三种一般少见,最后提醒大家一下,记得配置文件改好后一定要重启服务器啊。有问题,留言,或收听微薄。
来源:http://www.canphp.com/article/show-123.html
http://www.jb51.net/article/25476.htm
实践情况,自己试下如下:
RewriteEngine On
RewriteBase /
RewriteRule ^(.+).html$ test.php?id=$1
后来访问:http://www.happycun.com/11.html
跳转到了test.php
<?php
print_r($_SERVER);
print_r($GET);//这个有用参考:https://jackxiang.com/post/1950/
?>
共计有三个方法来调试这个Urlrewrite:
一)调试apache的urlrewrite是个大问题,这儿有两个哥们的博文作了介绍,特转之。
在旧的Apache的httpd.conf里面是有这样的参数的:
但是在新版本的Apache中,已经取消了RewriteLog这个参数,如果你加上这个参数只会使你的Apache无法启动!新版本的Apache已经把Rewrite模块的日志也写到了Apache的error.log中,只需要我们制定一下输出的log的级别和trace的深度就好了,例如
LogLevel alert rewrite:trace3
这样可以在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 后面添加如下代码
这样,如果要调试某些变量,只需要在URL中加入vardump的query即可。
如:http://www.drupal001.com/?vardump
就会跳转到baidu.com,从URL后面的Query即可得到某些参数的值。
这里列出来Apache默认的一些变量
这样就可以轻松的打印出某些具体变量的值,以便检查我们的设置是否正确。
其二,我们可以单独使用下面一行代码
把这行代码放到我们想要的RewriteRule的前面,如果我们的RewriteCond验证成功,则当前URL就可以被跳转,否则,不跳转。这样可以轻松的检查我们书写的RewriteCond是否正确。
此方法虽然没有检查Log文件那样正规,但是实用也易用,不失为一种调试URL重写的好办法。
来源:
http://www.drupal001.com/2012/05/apache-rewrite-url-debug/
http://www.nigesb.com/debug-the-mod_rewrite-in-apache.html
.htaccess 修改用不用重启apache:
http://blog.sina.com.cn/s/blog_6e770c2d0100z6w9.html
Apache是一个高度可配置的web服务器,而.htaccess则是高度可配置的重要原因之一。设想一下,如果每一个用户都将自己的配置信息写在httpd.conf文件里,那复杂性和安全性都将是巨大的隐患。
Apache通过.htaccess实现了面向目录的分布式配置功能,通过.htaccess,我们可以为不同的目录定制不同的功能。比如:1)目录默认页面 2)自定义错误页面 3)页面重定向 4)页面访问权限 等等。而且,对于用户来说,修改httpd.conf后,需要重启Apache才能生效;而修改.htaccess文件无需重启Apache使之生效,这也是.htaccess的另外一个优势
二)老外的工具介绍:
调试Apache的url重写规则的时候没有任何的提示和辅助工具,结果也只有成功/不成功两种,这个设置估计会让很多人尝试url重写功能的时候会抓狂,今天无意中有国外友人提供了一个在线的Apache url 重写规则调试器,地址在此:
http://civilolydnad.se/projects/rewriterule/
你可以在页面上的规则框中输入你想调试的规则,然后在上面的url框中输入访问地址查看规则的运行情况
另外这个测试工具暂时功能有限只能测试RewriteRule,像高级点的RewriteCond、RewriteMaps、RewriteBase这些规则都不支持,所以剩下的那些高级功能还是要自己慢慢刷页面调试了。
来自:http://be-evil.org/?post=231
试例测试:
输入:
magento.scnjw.gov.cn/new/abc.html
Url规则填写:
RewriteEngine On
RewriteRule ^magento.scnjw.gov.cn/new/(.*)$ http://www.yiphone.info/default/$1
得到结果:
Resulting URL: http://www.yiphone.info/default/abc.html
# Match? Rule Resulting URL
1 yes RewriteRule ^magento.scnjw.gov.cn/new/(.*)$ http://www.yiphone.info/default/$1 http://www.yiphone.info/default/abc.html
三)再就是把这个url通过PHP来输出:
把$_SERVER数组输出查看,print_r($_SERVER);
来自:http://blog.zol.com.cn/2269/article_2268695.html
实践情况如下:
如这个Url,用这个老外写的工具就不行,于是得用第三)个方法,直接print_r($_SERVER)打印来调试Url:
video/index-hot-2.html
UrlRewrite为:
RewriteEngine On
RewriteRule ^video/(index|list)(-(hot|fav|comment|dig|new))?(-(day|week|month))?(-(\\d+))?(-(\\d+))?\\.html$ /index.php?c=rank&a=video&style=$1&index=$3&period=$5&category=$7&page=$9&max_age=1800
通过print_r($_SERVER);die;得到:
[REQUEST_URI] => /video/index-hot-2.html
[REDIRECT_QUERY_STRING] => c=rank&a=video&style=index&index=hot&period=&category=2&page=&max_age=1800
[QUERY_STRING] => c=rank&a=video&style=index&index=hot&period=&category=2&page=&max_age=1800
可能出现下面这三种的错误可能性:
第一种:启用 rewrite 和 .htaccess 设置
rewrite设置:找到apache的配置文件httpd.conf文件,找到:#LoadModule rewrite_module modules/mod_rewrite.so去掉前面的#号。
改为:LoadModule rewrite_module modules/mod_rewrite.so
.htaccess设置:
windows里面这样设置:AccessFileName htaccess
linux里面这样设置:AccessFileName .htaccess。
linux比windows里面文件名前面多了一个点。如果没找到AccessFileName自己在httpd.conf文件最后面加上。
第二种:AllowOverride 的设置。
默认AllowOverride 为AllowOverride none。把这个改为:AllowOverride All。如果配置了多个虚拟目录需在每个目录里面开启,实例:
<VirtualHost *:80>
DocumentRoot "D:SvnTracsvnSVNRepositorywwwroot"
ServerName 127.0.0.1:80
DirectoryIndex index.html index.htm index.php index.shtml
<Directory "D:SvnTracsvnSVNRepositorywwwroot">
Options Indexes FollowSymLinks
AllowOverride ALL
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
<VirtualHost 127.0.0.2:80>
DocumentRoot "D:/SvnTrac/svn/SVNRepository/www/"
ServerName 127.0.0.2:80
DirectoryIndex index.html index.htm index.php index.shtml
<Directory "D:/SvnTrac/svn/SVNRepository/www/">
Options Indexes FollowSymLinks
AllowOverride ALL
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
第三种:Options 的设置
默认设置是:Options Indexes FollowSymLinks
如果改成以下设置后,就会出错
Options Indexes FollowSymLinks MultiViews Includes (出错)
如果要启用,目录浏览 MultiViews
服务器端包含 Includes (<!–#include virtual=”top.htm” –>)
为了简单可以设置为:Options All
前两种是配置中常见的错误,第三种一般少见,最后提醒大家一下,记得配置文件改好后一定要重启服务器啊。有问题,留言,或收听微薄。
来源:http://www.canphp.com/article/show-123.html
http://www.jb51.net/article/25476.htm
实践情况,自己试下如下:
RewriteEngine On
RewriteBase /
RewriteRule ^(.+).html$ test.php?id=$1
后来访问:http://www.happycun.com/11.html
跳转到了test.php
<?php
print_r($_SERVER);
print_r($GET);//这个有用参考:https://jackxiang.com/post/1950/
?>
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:http://jackxiang.com/post/5993/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2014-7-24 18:14
评论列表