我有一个网站,我有一个htaccess规则设置为整个网址,并使用以下规则将其转发到我的索引文件,一切正常。
#################################
# Magic Re-Writes DO NOT CHANGE #
#################################
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine on
#RewriteBase /
# Do Not apply if a specific file or folder exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# The rules on how to rewrite the urls
RewriteRule (.*) /index.php?url=$1 [QSA,L]
</IfModule>
因此以下规则转发http://mydomain.com/players/scoresheet/singlegame
到
http://mydomain.com/index.php?url=players/scoresheet/singlegame
但是,我还需要确保我能够满足人们忘记网址中的尾部斜线,这通常是直截了当的,但是,如果最后一个字符不是数字,我需要能够强制执行最后的斜杠:显然是一个斜线。
例如,有人打字;
http://mydomain.com/players/scoresheet/singlegame
我需要浏览器中的网址显示为:http://mydomain.com/players/scoresheet/singlegame/
但仍会转发至:http://mydomain.com/index.php?url=players/scoresheet/singlegame/
如上所述,例外情况是,如果最后一个字符已经有尾部斜杠,或者是数字。
(希望有意义)
好的,这是我到目前为止所拥有的......
#######################################
# Add trailing slash to url #
# unless last character is a number #
#######################################
<IfModule mod_rewrite.c>
RewriteEngine on
Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]
</IfModule>
#################################
# Magic Re-Writes DO NOT CHANGE #
#################################
<IfModule mod_rewrite.c>
Options +FollowSymlinks
RewriteEngine on
RewriteBase /
# Do Not apply if a specific file or folder exists
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# The rules on how to rewrite the urls
RewriteRule (.*) /index.php?url=$1 [QSA,L]
</IfModule>
这个问题虽然似乎似乎将斜杠添加到url中,但它也会加入index.php,所以我最终得到的是:
访问:http://mydomain.com/players/scoresheet/singlegame
将网址重写为:http://mydomain.com/index.php?url=players/scoresheet/singlegame/
添加了斜杠,但我需要它才能显示索引部分。
我已经前后退步,有许多不同的结果(通常是彻头彻尾的失败或循环)。
任何帮助将不胜感激
答案 0 :(得分:1)
你的规则是正确的,但即使不应该这样做,也会盲目地重定向。您上面的URL 可能而不是它被重写的内容。你有它:
http://mydomain.com/index.php?url=players/scoresheet/singlegame/
但我愿意打赌它真的像:
# note the slash here--------v
http://mydomain.com/index.php/?url=players/scoresheet/singlegame/
因为在内部重写URI并将其路由到/index.php
之后,重写引擎再次循环并且重定向捕获它,并将/index.php
重定向到/index.php/
。因此,您需要在路由规则中添加相同的排除条件:
所以改变:
Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]
要么:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]
或:
RewriteCond %{REQUEST_URI} !index.php
Rewritecond %{REQUEST_URI} [^0-9/]$
RewriteRule ^(.*)$ /$1/ [R=301,L]