【问题标题】:htaccess internal rewrite for URL with query params带有查询参数的 URL 的 htaccess 内部重写
【发布时间】:2016-10-08 13:36:18
【问题描述】:

我有一个 php 文件 /var/www/somepath/index.php 处理请求

http://example.com/somepath/?q=query

我想用同一个文件来处理请求

http://example.com/some/other/path/?q=query
http://example.com/another/path/?q=query
http://example.com/yet/another/path/?q=query

我不想将 php 文件复制到文件系统中的多个位置。我认为使用内部重写规则会是一种更好的方法。这是我放在顶级.htaccess 文件/var/www/.htaccess 中的内容:

RewriteRule ^some/other/path /somepath/%{QUERY_STRING} [PT]

但它不起作用。我得到了一个 404 http://example.com/some/other/path/?q=query

我知道 mod_rewrite 已启用,因为我在同一个 .htaccess 文件中有外部重写规则(301 和 302 重定向)并且这些规则有效。

【问题讨论】:

    标签: apache .htaccess mod-rewrite


    【解决方案1】:

    您可以将此规则作为您的第一条规则放在站点根目录 .htaccess 中,它将处理带有 ?q= 查询参数的任何 URL:

    RewriteEngine On
    
    RewriteCond %{QUERY_STRING} (^|&)q= [NC]
    RewriteRule ^ somepath/index.php [L]
    

    【讨论】:

    • 谢谢阿努巴瓦。如果用户浏览到example.com/some/other/path/?q=query,是什么让 URL 的“some/other/path”部分消失了?我们没有将它作为重写规则的一部分进行匹配,所以它保留在 URL 中?还是旧 URL 会被彻底清除?如果是这样,查询字符串是否也会被清除?
    • 这是内部重写,不会丢失任何信息。如果您检查$_SERVER["REQUEST_URI"],它将显示/some/other/path/?q=query$_SERVER["QUERY_STRING"] 将显示q=query,最后如果您检查$_SERVER["SCRIPT_NAME"],它将显示重写路径,即/somepath/index.php
    猜你喜欢
    • 1970-01-01
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多