如何使用重写规则删除除特定 URL 的“回调”之外的任何查询



当前RewriteRule删除除任何 URL 的查询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]

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

  • 不重写/API?回调=1,/API/user?callback=1,/api/user/2?callback=1
  • 重写/APIS?callback=1,/user?callback=1,/api/user?foo=1 等。

我终于明白你的问题了...

替换以下行:

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

用这一行:

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

重要通知:

如果您的脚本不在文档根目录中,而是在目录/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]

在它之前重复重写Cond:

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

为了能够在/foo子目录中使用这些规则,请将^/api替换为^/foo/api

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

此规则工作正常并修复了此问题:

# 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]

最新更新