如果最后一个字符不是数字或斜杠,则htaccess重写/重定向

时间:2013-06-13 16:37:51

标签: .htaccess

我有一个网站,我有一个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/

添加了斜杠,但我需要它才能显示索引部分。

我已经前后退步,有许多不同的结果(通常是彻头彻尾的失败或循环)。

任何帮助将不胜感激

1 个答案:

答案 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]