当前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.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]