当前的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\/?([^\/]*)$
重写?例外结果:
答案 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]