如何同时执行内部和外部.htacces重写以从所有URI中完全删除所有QUERY_STRING元素,并使用相对路径

时间:2015-11-02 22:11:48

标签: php regex .htaccess mod-rewrite query-string

我想删除所有客户端请求查询字符串,没有例外。 我已经尝试了所有我能找到的东西,以及我所知道的关于正则表达式的所有内容,这个任务让我很困惑。我已经能够实现删除查询字符串,但现在所有请求都在重写和重定向时将完整的文件路径添加到工作目录之前。

示例:这些中没有http,因为stackoverflow不允许我发布URL。

我访问文件:/localhost/testing/dogs/pups.txt 是的,pups.txt存在并且就在那里。

服务器将此内容返回给浏览器:/localhost/home/user/public_html/testing/dogs/pups.txt

如果我使用附加的查询字符串访问它: /localhost/testing/dogs/pups.txt?bark=woof

我得到相同的输出到浏览器: /localhost/home/gost/public_html/testing/dogs/pups.txt

所以我知道查询字符串正在被修复,而完整的根路径被添加到超文本地址。

如何告诉mod_rewrite保留现有文件的相对路径,以便完整文件路径的前置停止,并准确地使其在内部和外部重写,以便没有任何查询字符串进入php-land ?

这是当前的.htaccess文件。它位于目录/ home / user / public_html / testing中。如果在线部署,则无法将其放在根网站目录中,这是一个可以立即解决此问题的明显举措。

# These are commented out on purpose because they kill access to the server.
    # The weird rules for regex in Apache configurations is baffling me. This
    # does remove all QUERY_STRING characters, but, it then rewrites by 
    # prepending the web root path to the current directory, causing error 404.

    # RewriteCond %{QUERY_STRING} ^
    # RewriteRule  (.*) $1? [R=301,L]

    # These rules work fine. Whatever does not end with a media or document
    # extension gets sent to index.php

    RewriteRule ^.*\.(gif|jpe?g|png|txt|svg|pdf|rtf|odt|doc|docx)$ - [L]
    RewriteRule ^.*\.(tex|epub|mobi|csv|ods|xls|swf|flv)$ - [L]

    RewriteRule ^ index.php [L]

2 个答案:

答案 0 :(得分:0)

我不能接受我自己的答案两天,所以如果有人想为未来的提问者添加关于mod_rewrite的逻辑,那就去吧。按照巴拿马杰克的建议,这个.htaccess文件可以完成这个工作并回答这个问题。

RewriteEngine On

RewriteCond %{QUERY_STRING} .
RewriteRule (.*) /testing/$1? [R=301,L]

RewriteRule ^.*\.(gif|jpe?g|png|txt|svg|pdf|rtf|odt|doc|docx)$ - [L]
RewriteRule ^.*\.(tex|epub|mobi|csv|ods|xls|mm|)$ - [L]

RewriteRule ^ test.php [L]

答案 1 :(得分:0)

将此RewriteCond %{QUERY_STRING} ^更改为此RewriteCond %{QUERY_STRING} . 并将目录添加到规则中,因为您无法使用rewritebase。所以看起来应该是这样的

RewriteCond %{QUERY_STRING} .
RewriteRule (.*) /testing/$1? [R=301,L]