301重定向是追加?_url

时间:2016-07-18 19:08:50

标签: php regex apache .htaccess phalcon

我正在尝试为使用Phalcon Framework构建的网站设置301重定向。

问题

我的重定向工作正常,但是在重定向后它会在旧网址后附加?_url=

默认.htaccess

以下是.htaccess中的Phalcon框架附带的内容:

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]

实施例

当用户访问http://example.net/fr/le-circuit/a-propos时,它会重定向到http://example.net/fr/circuit?_url=/fr/le-circuit/a-propos

正如您所看到的,?_url=是我要删除的额外内容。

我的.htaccess

这是我没有重定向的.htaccess

AddDefaultCharset UTF-8

<IfModule mod_rewrite.c>
    RewriteEngine On

    # Redirection for old website links

    RewriteCond %{HTTP:Accept-Language} ^fr [NC]
    RewriteRule ^$ /fr/ [L,R=301]

    RewriteCond %{HTTP:Accept-Language} ^en [NC]
    RewriteRule ^$ /en/ [L,R=301]

    RewriteRule ^$ /fr/ [L,R=301]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]
</IfModule>

尝试#1

我尝试了以下重定向指令beforeafter Phalcon附带的默认重写规则。

Redirect 301 /fr/le-circuit/a-propos /fr/circuit

尝试#2

我认为我的第一次尝试不够严格所以我决定使用正则表达式和RedirectMatch:

RedirectMatch 301 ^/fr/le-circuit/a-propos/?$ /fr/circuit

就像以前一样,我在Phalcon附带的规则之前和之后尝试过,并且在重定向之后附加了旧的URL。

尝试#3

我尝试在重定向中对网址进行硬编码,以查看?_url=是否仍然会附加,并且......是的。

RewriteMatch 301 ^/fr/le-circuit/a-propos/?$ http://example.net/fr/circuit

有没有人知道这个问题,或者知道为什么它会在重定向后附加旧网址?

2 个答案:

答案 0 :(得分:2)

在其他规则之前保留重定向规则:

RewriteEngine On

# Redirection for old website links
RewriteRule ^fr/le-circuit/a-propos/?$ http://example.net/fr/circuit [L,NC,R=301]

RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /fr/ [L,R=301]

RewriteCond %{HTTP:Accept-Language} ^en [NC]
RewriteRule ^$ /en/ [L,R=301]

RewriteRule ^$ /fr/ [L,R=301]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L]

确保在测试此更改时清除浏览器缓存。

答案 1 :(得分:0)

确保在使用301永久重定向时清除缓存。始终将它们调试为302临时重定向。当您在.htaccess文件中注释掉重定向时,请确保缓存清除可防止重定向发生。完成后,您可以尝试以下建议:

使用引导程序中的REQUEST_URI完全抛弃“_url”: 使用RewriteRule .* index.php [L]代替:RewriteRule ^(.*)$ index.php?_url=/$1 [QSA,L] 然后在index.php bootstrap中使用这一行:

echo $application->handle(strtok($_SERVER["REQUEST_URI"],'?'))->getContent();

而不是echo $application->handle()->getContent();默认处理$_GET['_url']