Regex 如何使用RewriteRule删除特定URL的除“回调”之外的任何查询?
当前的Regex 如何使用RewriteRule删除特定URL的除“回调”之外的任何查询?,regex,apache,mod-rewrite,query-string,Regex,Apache,Mod Rewrite,Query String,当前的RewriteRule删除除查询回调之外的任何URL查询 # 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
RewriteRule
删除除查询回调
之外的任何URL查询
# 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\/?([^\/]*)$重写
?例外结果:
- 不重写/api?callback=1、/api/user?callback=1、/api/user/2?callback=1
- 重写/api?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=.*
重要提示:
如果脚本不在文档根目录中,但在dir/htest
中,
完整的URL看起来像我的:http://localhost/htest/api/?callback=1
,则必须在重写条件中输入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 %{REQUEST_URI}?%{QUERY_STRING} !^/api(/.*)?\?callback=.*
RewriteRule ^([^.]*)$ index.php?url=$1 [QSA,L]
为了能够在
/foo
子目录中使用这些规则,将^/api
替换为^/foo/api要为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]
由于其他一些规则,您可能会收到重定向到/index.php的消息。另外,请清除浏览器缓存,并在调试时尝试使用R=temporary
而不是R=301
,因为永久重定向会被缓存,并且您可能会看到以前重写尝试的结果。谢谢,您的重写规则实际上可以按照您所解释的那样工作。但是当使用RewriteRule^([^.]*)$index.php?url=$1[QSA,L]
后,它就会中断。有解决办法吗?还有什么方法可以使用^/api
选项,即使.htaccess不在根目录下(文件位置/foo/.htaccess
,URL重写/foo/api
,重写cond
用于^/api
而不是完整路径,因为项目/foo
可以位于任何路径中)?我提供的示例是针对位于文档根目录中的.htaccess的,index.php也应该在那里。如果将脚本放入/foo,请添加RewriteBase/foo
并更改^/api
转换为^/foo/api
too您的更新2返回错误404
。有什么问题吗?