如何使用RewriteRule删除除`callback`以外的任何查询?

时间:2012-09-20 08:48:15

标签: regex apache mod-rewrite query-string

当前的RewriteRule会删除除查询callback以外的任何查询。

# Remove question mark and parameters
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^?#\ ]*)\?[^\ ]*\ HTTP/ [NC]
# Query rewrite exceptions
##RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !^/api.*?callback=.* #does not work
RewriteCond %{QUERY_STRING} !callback=
RewriteRule .*$ %{REQUEST_URI}? [R=301,L]

如何避免仅从网址callback进行查询^api\/?([^\/]*)$重写?例外结果:

  • 没有重写/ api?callback = 1,/ api / user?callback = 1,/ api / user / 2?callback = 1
  • 重写/ apis?callback = 1,/ user?callback = 1,/ api / user?foo = 1等。

2 个答案:

答案 0 :(得分:1)

我终于理解了你的问题......

替换这些行:

##RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !^/api.*?callback=.* #does not work
RewriteCond %{QUERY_STRING} !callback=

这一行:

RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !^/api(/.*)?\?callback=.*

重要提示:

如果您的脚本不在文档根目录中,但是在dir /htest中, 和完整的URL看起来像我的http://localhost/htest/api/?callback=1,然后你必须在你的RewriteCond中填写API的完整路径:

RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !^/htest/api(/.*)?\?callback=.*

您可以通过使用!/api而不是^/path/to/api开始使用正则表达式来解决这个问题,但是/foo/api/bar/api也会被重写。

<强>更新

这个.htaccess在文档根目录中运行良好:

RewriteEngine On

RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([^?#\ ]*)\?[^\ ]*\ HTTP/ [NC]
RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !^/api(/.*)?\?callback=.*
RewriteRule .*$ %{REQUEST_URI}? [R=temporary,L]

您可以尝试使用它而不需要任何其他规则来检查错误

更新2

如果您有其他条件,即

RewriteRule ^([^.]*)$ index.php?url=$1 [QSA,L]

在它之前重复RewriteCond:

RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !^/api(/.*)?\?callback=.*
RewriteRule ^([^.]*)$ index.php?url=$1 [QSA,L]

也可以在/foo subdir中使用这些规则,将^/api替换为^/foo/api

答案 1 :(得分:1)

要为 index.php 启用RewriteRule,需要添加查询重写例外。

此规则运行正常并解决了此问题:

# Remove question mark and parameters
RewriteCond %{QUERY_STRING} .+
# Query rewrite exceptions
RewriteCond %{REQUEST_FILENAME} !index.php
RewriteCond %{REQUEST_URI}?%{QUERY_STRING} !/api(/.*)?\?callback=.*
RewriteRule .*$ %{REQUEST_URI}? [R=301,L]