我试图查看多个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
有关如何重写规则的任何建议吗?
答案 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]
它会将所有直接请求重定向到php文件:/something.php
将重定向到/something
将删除尾部斜杠,如果请求的资源不是目录。因此,如果您请求/home/
并且您确实拥有此类文件夹,则不会将其重定向到/home
。
如果存在,请在内部将请求重写到同一个命名的PHP文件中。如果您要求/about
并且您有/about.php
,那么它会重写;如果你没有/about.php
那么没有任何事情发生(好吧,至少不是这些规则 - 如果你有更多的规则,那么这个请求可以在以后匹配..或者将显示404错误页面。)
如果您要求/about
,您有/about.php
并且您还有/about
文件夹,则请求将进入文件夹。如果您不希望这种情况发生(/about
应始终重写为/about.php
),则需要从上一个块中删除RewriteCond %{REQUEST_FILENAME} !-d
。但是因为你当前的.htaccess中的条件完全相同,所以我认为这是理想的行为。