Htaccess记录:修订间差异

来自三线的随记
(创建页面,内容为“Apache URL重写引擎规则编写随记 === debug-type1 === 对于Apache URL重写的调试,一直是比较头疼的问题,因为在服务器端并且没有deb…”)
 
无编辑摘要
第4行: 第4行:
对于Apache URL重写的调试,一直是比较头疼的问题,因为在服务器端并且没有debug工具。网上流行的方法就是用rewrite的日志文件,给virtualhost添加如下设置:<blockquote>#Rewrite Log</blockquote><blockquote>RewriteLog logs/rewrite.log #此处可以写绝对地址 </blockquote><blockquote>RewriteLogLevel 3</blockquote>但是,实际上,Since Apache httpd 2.4 mod_rewrite RewriteLog and RewriteLogLevel directives has been completely replaced by the new per-module logging configuration.
对于Apache URL重写的调试,一直是比较头疼的问题,因为在服务器端并且没有debug工具。网上流行的方法就是用rewrite的日志文件,给virtualhost添加如下设置:<blockquote>#Rewrite Log</blockquote><blockquote>RewriteLog logs/rewrite.log #此处可以写绝对地址 </blockquote><blockquote>RewriteLogLevel 3</blockquote>但是,实际上,Since Apache httpd 2.4 mod_rewrite RewriteLog and RewriteLogLevel directives has been completely replaced by the new per-module logging configuration.


应改为<blockquote><code>LogLevel alert rewrite:trace6</code> #(can be increased to trace8)</blockquote>但是这样的调试有很多弊端,
 
应改为<blockquote>LogLevel alert rewrite:trace6 #(can be increased to trace8)</blockquote>但是这样的调试有很多弊端,
# Apache的RewriteLog指令只能在conf文件中,不能在.htaccess文件,所以必须具有root用户权限,并且修改后需要重启apache,对调试代理复杂性。
# Apache的RewriteLog指令只能在conf文件中,不能在.htaccess文件,所以必须具有root用户权限,并且修改后需要重启apache,对调试代理复杂性。
# 默认的日志位置 /var/log/httpd 也只能有root用户才能访问。
# 默认的日志位置 /var/log/httpd 也只能有root用户才能访问。
第11行: 第12行:
=== debug-type2 ===
=== debug-type2 ===
利用301跳转将变量放入新地址栏
利用301跳转将变量放入新地址栏
{| class="wikitable"
#Should use vardump in Query
|
  #Should use vardump in Query
  RewriteCond %{QUERY_STRING} vardump
  RewriteCond %{QUERY_STRING} vardump
  RewriteRule (.*) <nowiki>http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI}</nowiki> [R=301,L,QSA]
  RewriteRule (.*) <nowiki>http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI}</nowiki> [R=301,L,QSA]
|}
这里列出来Apache默认的一些变量
这里列出来Apache默认的一些变量
{| class="wikitable"
#Apache variables
|
  #Apache variables
  HTTP_USER_AGENT
  HTTP_USER_AGENT
  HTTP_REFERER
  HTTP_REFERER
第63行: 第59行:
  IS_SUBREQ
  IS_SUBREQ
  HTTPS
  HTTPS
|}
 
这样就可以轻松的打印出某些具体变量的值,以便检查我们的设置是否正确。
这样就可以轻松的打印出某些具体变量的值,以便检查我们的设置是否正确。


'''其二,我们可以单独使用下面一行代码'''
'''其二,我们可以单独使用下面一行代码'''
{| class="wikitable"
 
|
  <nowiki>#Goto baidu
  #Goto baidu
  RewriteRule (.*) http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI}</nowiki> [R=301,L,QSA]
  RewriteRule (.*) <nowiki>http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI}</nowiki> [R=301,L,QSA]
 
|}
把这行代码放到我们想要的RewriteRule的前面,如果我们的RewriteCond验证成功,则当前URL就可以被跳转,否则,不跳转。这样可以轻松的检查我们书写的RewriteCond是否正确。
把这行代码放到我们想要的RewriteRule的前面,如果我们的RewriteCond验证成功,则当前URL就可以被跳转,否则,不跳转。这样可以轻松的检查我们书写的RewriteCond是否正确。



2019年1月1日 (二) 16:11的版本

Apache URL重写引擎规则编写随记

debug-type1

对于Apache URL重写的调试,一直是比较头疼的问题,因为在服务器端并且没有debug工具。网上流行的方法就是用rewrite的日志文件,给virtualhost添加如下设置:

#Rewrite Log

RewriteLog logs/rewrite.log #此处可以写绝对地址

RewriteLogLevel 3

但是,实际上,Since Apache httpd 2.4 mod_rewrite RewriteLog and RewriteLogLevel directives has been completely replaced by the new per-module logging configuration.


应改为

LogLevel alert rewrite:trace6 #(can be increased to trace8)

但是这样的调试有很多弊端,

  1. Apache的RewriteLog指令只能在conf文件中,不能在.htaccess文件,所以必须具有root用户权限,并且修改后需要重启apache,对调试代理复杂性。
  2. 默认的日志位置 /var/log/httpd 也只能有root用户才能访问。
  3. 由于一次刷新网页的请求很多(如很多图片、js的请求),导致日志文件比较凌乱,查看也比较困难。

debug-type2

利用301跳转将变量放入新地址栏

#Should use vardump in Query
RewriteCond %{QUERY_STRING} vardump
RewriteRule (.*) http://www.baidu.com/?host=%{HTTP_HOST},rurl=%{REQUEST_URI} [R=301,L,QSA]

这里列出来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重写的好办法。

注:摘自互联网文章,略加修改整合,仅供记录参考