htaccess - 没有按预期工作

时间:2015-08-27 17:36:44

标签: regex apache .htaccess mod-rewrite redirect

我正在尝试为laravel的public/.htaccess文件添加一些重写条件。

这是文件的内容:

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews
    </IfModule>

    RewriteEngine On

    RewriteCond %{REQUEST_URI}  ^/page(.*)\.php$
    RewriteCond %{QUERY_STRING} ^id=([0-9]*)$
    RewriteRule ^(.*)$ /pages%1/%2? [R=302,L]

    # Redirect Trailing Slashes...
    RewriteRule ^(.*)/$ /$1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
</IfModule>

在此进行在线测试(link),为我提供了所需的结果https://domain.com/page.php?id=1234 -> https://domain.com/pages/1234

然而,当我把它放在我的服务器上时,我将被重定向到此网址而不是https://domain.com/pages12345

在我看来,此行(.*)上的https://domain.com/campaign.php?id=12345未传递给%1。而是仅传递查询字符串值。

是否可能是因为apache版本不同?我该如何修改?

此外,有人可以评论代码本身吗?我在这里要做的是将与/page*.php?id=1234匹配的任何网址重定向到pages*/1234

即。

/page.php?id=1234      -> /pages/1234
/page-home.php?id=1234 -> /pages-home/1234

1 个答案:

答案 0 :(得分:1)

将您的规则更改为:

RewriteCond %{QUERY_STRING} ^id=([0-9]*)$ [NC]
RewriteRule ^(page)([^.]*)\.php$ /$1s$2/%1? [R=302,NC,L]

确保在测试之前清除浏览器缓存。

关于正则表达式:

^       # input start
(page)  # match and group page in group #`
([^.]*) # match 0 or more of any char that is not a DOT and group it as group #2
\.php   # match literal .php
$       # end of input

更换部分:

/   # literal /
$1  # backreference to group #1 i.e. (page)
s   # character s
$2  # backreference to group #1 i.e. ([^.]*)
/   # literal /
%1  # backreference to group #1 from RewriteCoond i.e. ([0-9]*)
?   # ? is used to strip off query string