我正在尝试为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
答案 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