3

我有一个网站,我设置了一个 htaccess 规则来获取整个 url,并使用以下规则将其转发到我的索引文件,一切正常。

#################################
# 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

但是,我还需要确保我能满足人们忘记 url 中的尾部斜杠的需求,这通常是直截了当的,但是,只有当最后一个字符不是数字(或显然是斜杠)时,我才需要能够强制使用最后的斜杠)。

例如,有人打字;

http://mydomain.com/players/scoresheet/singlegame

我需要浏览器中的 url 显示为: 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

将 url 重写为:http ://mydomain.com/index.php?url=players/scoresheet/singlegame/

添加了斜线,但我需要它这样做而不显示索引部分。

我来回走动,有许多不同的结果(通常是彻底的失败或循环)。

任何帮助,将不胜感激

4

1 回答 1

2

您的规则是正确的,但即使不应该这样做,它也会盲目地重定向。您上面的 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]
于 2013-06-13T18:00:29.057 回答