301重定向中的尾部斜杠

时间:2011-06-29 18:08:43

标签: apache mod-rewrite url-rewriting

我试图查看多个mod_rewrite问题,所以如果这是重复的话我会道歉。

我正在尝试设置它,以便如果你去domain.com/about.php它会删除.php,如果你去domain.com/about,它就会像那样。

Options +FollowSymlinks
RewriteEngine On
RewriteBase /
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ /$1.php [L,QSA]
RewriteRule ^(.*)/$ /$1 [L,R=301]

所以,现在,如果您访问domain.com/about,它会显示该页面,但如果您转到domain.com/about.php,则不会删除该扩展程序。

此外,我有301重定向

redirect 301 /our-clients http://www.domain.com/about-ourclients

这很有效,但是如果用户使用尾部斜杠转到domain.com/our-clients/,则会将它们定向到about-ourclients.php

有关如何重写规则的任何建议吗?

1 个答案:

答案 0 :(得分:2)

这应该做的工作:

Options +FollowSymlinks
RewriteEngine On
RewriteBase /

# remove .php ONLY if requested directly
RewriteCond %{THE_REQUEST} (\.php\sHTTP/1)
RewriteRule ^(.+)\.php$ /$1 [R=301,L,QSA]

# remove trailing slash ONLY if it is not an existing folder
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)/$ /$1 [L,R=301]

# rewrite to FILENAME.php if such file does exist and is not a folder
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /$1.php [L,QSA]
  1. 它会将所有直接请求重定向到php文件:/something.php将重定向到/something

  2. 将删除尾部斜杠,如果请求的资源不是目录。因此,如果您请求/home/并且您确实拥有此类文件夹,则不会将其重定向到/home

  3. 如果存在,请在内部将请求重写到同一个命名的PHP文件中。如果您要求/about并且您有/about.php,那么它会重写;如果你没有/about.php那么没有任何事情发生(好吧,至少不是这些规则 - 如果你有更多的规则,那么这个请求可以在以后匹配..或者将显示404错误页面。)

  4. 如果您要求/about,您有/about.php并且您还有/about文件夹,则请求将进入文件夹。如果您不希望这种情况发生(/about应始终重写为/about.php),则需要从上一个块中删除RewriteCond %{REQUEST_FILENAME} !-d。但是因为你当前的.htaccess中的条件完全相同,所以我认为这是理想的行为。