Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何使用RewriteRule删除特定URL的除“回调”之外的任何查询?_Regex_Apache_Mod Rewrite_Query String - Fatal编程技术网

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
      。有什么问题吗?