0

当前删除任何查询,但对任何 URL 的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仅从 URL 重写查询^api\/?([^\/]*)$?异常结果:

  • 无需重写 /api?callback=1, /api/user?callback=1, /api/user/2?callback=1
  • 重写 /apis?callback=1、/user?callback=1、/api/user?foo=1 等。
4

2 回答 2

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]

也能够在/foosubdir 中使用这些规则,替换^/api^/foo/api

于 2012-09-20T10:45:46.637 回答
1

RewriteRule要启用index.php,需要添加查询重写异常。

此规则工作正常并解决了此问题:

# 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]
于 2012-09-29T20:35:48.023 回答