【问题标题】:Apache RewriteRule [L] not being honouredApache RewriteRule [L] 未得到尊重
【发布时间】:2015-09-09 00:30:40
【问题描述】:

在启用了 SEF 的 Joomla 网站中,我有关键字友好的 url,例如 /keyword/keyword。我需要重写所有以index.php开头的url,例如/index.php/keyword/keyword

我尝试在 Joomla 附带的核心 .htaccess 规则之后和之前添加条件 RewriteRule:

## Begin - Joomla! core SEF Section.
#
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
#
# If the requested path and file is not /index.php and the request
# has not already been internally rewritten to the index.php script
RewriteCond %{REQUEST_URI} !^/index\.php
# and the requested path and file doesn't directly match a physical file
RewriteCond %{REQUEST_FILENAME} !-f
# and the requested path and file doesn't directly match a physical folder
RewriteCond %{REQUEST_FILENAME} !-d
# internally rewrite the request to the index.php script
RewriteRule .* index.php [L]
#
## End - Joomla! core SEF Section.


#rewrite all urls starting with index.php

RewriteCond %{REQUEST_URI} ^/index.php
RewriteRule ^index.php(.*?)$ /$1 [R=302,L]

这是重写日志:

[Tue Jun 23 11:19:35.986104 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] strip per-dir prefix: /home/jochen/projects/acgwebsite/trunk/nz/nzic -> nz/nzic
[Tue Jun 23 11:19:35.986118 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] applying pattern '.*' to uri 'nz/nzic'
[Tue Jun 23 11:19:35.986137 2015] [rewrite:trace5] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] setting env variable 'HTTP_AUTHORIZATION' to ''
[Tue Jun 23 11:19:35.986150 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] add path info postfix: /home/jochen/projects/acgwebsite/trunk/nz -> /home/jochen/projects/acgwebsite/trunk/nz/nzic
[Tue Jun 23 11:19:35.986162 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] strip per-dir prefix: /home/jochen/projects/acgwebsite/trunk/nz/nzic -> nz/nzic
[Tue Jun 23 11:19:35.986177 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] applying pattern '.*' to uri 'nz/nzic'
[Tue Jun 23 11:19:35.986192 2015] [rewrite:trace4] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] RewriteCond: input='/nz/nzic' pattern='!^/index\\.php' => matched
[Tue Jun 23 11:19:35.986215 2015] [rewrite:trace4] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] RewriteCond: input='/home/jochen/projects/acgwebsite/trunk/nz' pattern='!-f' => matched
[Tue Jun 23 11:19:35.986234 2015] [rewrite:trace4] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] RewriteCond: input='/home/jochen/projects/acgwebsite/trunk/nz' pattern='!-d' => matched
[Tue Jun 23 11:19:35.986246 2015] [rewrite:trace2] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] rewrite 'nz/nzic' -> 'index.php'
[Tue Jun 23 11:19:35.986262 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] add per-dir prefix: index.php -> /home/jochen/projects/acgwebsite/trunk/index.php
[Tue Jun 23 11:19:35.986277 2015] [rewrite:trace2] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] strip document_root prefix: /home/jochen/projects/acgwebsite/trunk/index.php -> /index.php
[Tue Jun 23 11:19:35.986291 2015] [rewrite:trace1] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f48292070a0/initial] [perdir /home/jochen/projects/acgwebsite/trunk/] internal redirect with /index.php [INTERNAL REDIRECT]
[Tue Jun 23 11:19:35.986353 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] strip per-dir prefix: /home/jochen/projects/acgwebsite/trunk/index.php -> index.php
[Tue Jun 23 11:19:35.986385 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] applying pattern '.*' to uri 'index.php'
[Tue Jun 23 11:19:35.986403 2015] [rewrite:trace5] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] setting env variable 'HTTP_AUTHORIZATION' to ''
[Tue Jun 23 11:19:35.986420 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] strip per-dir prefix: /home/jochen/projects/acgwebsite/trunk/index.php -> index.php
[Tue Jun 23 11:19:35.986432 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] applying pattern '.*' to uri 'index.php'
[Tue Jun 23 11:19:35.986450 2015] [rewrite:trace4] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] RewriteCond: input='/index.php' pattern='!^/index\\.php' => not-matched
[Tue Jun 23 11:19:35.986463 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] strip per-dir prefix: /home/jochen/projects/acgwebsite/trunk/index.php -> index.php
[Tue Jun 23 11:19:35.986478 2015] [rewrite:trace3] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] applying pattern '^index.php(.*?)$' to uri 'index.php'
[Tue Jun 23 11:19:35.986495 2015] [rewrite:trace4] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] RewriteCond: input='/index.php' pattern='^/index.php' => matched
[Tue Jun 23 11:19:35.986511 2015] [rewrite:trace2] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] rewrite 'index.php' -> '/'
[Tue Jun 23 11:19:35.986527 2015] [rewrite:trace2] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] explicitly forcing redirect with http://acgwebsite.example.com/
[Tue Jun 23 11:19:35.986540 2015] [rewrite:trace1] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] escaping http://acgwebsite.example.com/ for redirect
[Tue Jun 23 11:19:35.986554 2015] [rewrite:trace1] [pid 25526] mod_rewrite.c(468): [client 127.0.0.1:40592] 127.0.0.1 - - [acgwebsite.example.com/sid#7f483be32210][rid#7f4829214bf8/initial/redir#1] [perdir /home/jochen/projects/acgwebsite/trunk/] redirect to http://acgwebsite.example.com/ [REDIRECT/302]

似乎第一次重写时的 [L] 被忽略,第二次重写无论如何都会执行。我该如何解决这个问题?

澄清我期望发生的事情:

http://test.com/index.php/keyword header redirect 301 -> http://test.com/keyword
http://test.com/keyword rewrite -> http://test.com/index.php/keyword 

【问题讨论】:

    标签: apache .htaccess mod-rewrite joomla rewrite


    【解决方案1】:

    L 仅结束当前规则 ant 导致 mod_rewrite 再次循环遍历您的 .htaccess。

    实际上,您需要的是重新排序规则以在重写之前保持重定向:

    ## Begin - Joomla! core SEF Section.
    
    #rewrite all urls starting with index.php
    RewriteCond %{THE_REQUEST} /index\.php [NC]
    RewriteRule ^index\.php(.*)$ $1 [R=302,L]
    
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    
    # If the requested path and file is not /index.php and the request
    # has not already been internally rewritten to the index.php script
    RewriteCond %{REQUEST_URI} !^/index\.php
    # and the requested path and file doesn't directly match a physical file
    RewriteCond %{REQUEST_FILENAME} !-f
    # and the requested path and file doesn't directly match a physical folder
    RewriteCond %{REQUEST_FILENAME} !-d
    # internally rewrite the request to the index.php script
    RewriteRule .* index.php [L]
    #
    ## End - Joomla! core SEF Section.
    

    请务必在清除浏览器缓存后对其进行测试。

    【讨论】:

    • 不幸的是,我得到了完全相同的结果。如果我在这里尝试我的规则,并删除 E=HTTP_AUTHORIZATION:%{HTTP:Authorization} 规则,那么它就可以工作。但是在我的本地测试系统中删除它并不能解决问题。
    • 那么您在浏览器中输入的 URL 是什么,您看到了什么错误?
    • 我正在输入 test.com/keyword/keyword 并被重定向到 test.com,这是不正确的。
    【解决方案2】:

    我建议您使用 ErrorDocument 而不是尝试将其与重写规则一起使用:

    ## Begin - Joomla! core SEF Section.
    #
    RewriteRule ^ - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
    ErrorDocument 404 /index.php
    

    【讨论】:

    • 我不是在寻找错误文档。我正在寻找一种解决方案,允许我重定向test.com/index.php/keyword/keyword 而不会影响其他任何东西。
    • 我对你在这个问题中提到的不同网址感到困惑:在一条评论中你说你想重定向 example.com/keyword/keyword,在这里你说你想重定向 example.com/ index.php/关键字/关键字。人们在浏览器中输入的实际网址是什么?那应该在内部重定向到 index.php 脚本?
    猜你喜欢
    • 2016-04-06
    • 2019-12-06
    • 1970-01-01
    • 2013-11-02
    • 2016-03-22
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    • 2011-03-29
    相关资源
    最近更新 更多