mod_rewrite删除.php,但仍然服务.php文件?

我只是想用mod_rewrite做一个简单的事情。 我有一个网站使用.php文件,我想重写那些更干净的url,并删除.php。 所以,文件将是www.mysite.com/contact等。

这确实是我想要的,但我期望它仍然会服务于我的contact.php文件,但只是向用户显示他们在/ contact而不是contact.php。 但是,它正在寻找一个叫做联系人的文件,这不在那里。

那么,我需要做什么,仍然使用我的contact.php文件,但重写用户的URL /联系?

这是我正在使用的:

SetEnv APPLICATION_ENV development RewriteEngine on RewriteBase / # Always use www. RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC] RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301] # Change urlpath.php to urlpath RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] RewriteRule ^(.*)\.php$ http://www.mysite.com/$1 [L,R=301] 

对于这个解决方案,我遵循了以下规则:

  1. 如果用户试图加载/something他们应该被外部重定向到/something
  2. 如果用户试图加载/something那么他们应该被内部重定向到/something.php
  3. 如果用户将任何查询字符串参数传递给URL,则应通过重定向保留这些参数。
  4. 如果用户试图加载文件系统中真正存在的不同文件(样式表,图像等),则应该按原样加载。

这里是mod_rewrite魔法的最后一集:

 RewriteEngine on RewriteBase / ## Always use www. RewriteCond %{HTTP_HOST} ^mysite\.com$ [NC] RewriteRule ^(.*)$ http://www.mysite.com/$1 [L,R=301] # Change urlpath.php to urlpath ## Only perform this rule if we're on the expected domain RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] ## Don't perform this rule if we've already been redirected internally RewriteCond %{QUERY_STRING} !internal=1 [NC] ## Redirect the user externally to the non PHP URL RewriteRule ^(.*)\.php$ $1 [L,R=301] # if the user requests /something we need to serve the php version if it exists ## Only perform this rule if we're on the expected domain RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] ## Perform this rule only if a file with this name does not exist RewriteCond %{REQUEST_FILENAME} !-f ## Perform this rule if the requested file doesn't end with '.php' RewriteCond %{REQUEST_FILENAME} !\.php$ [NC] ## Only perform this rule if we're not requesting the index page RewriteCond %{REQUEST_URI} !^/$ ## Finally, rewrite the URL internally, passing through the user's query string ## using the [qsa] flag along with an 'internal=1' identifier so that our first ## RewriteRule knows we've already redirected once. RewriteRule ^(.*)$ $1.php?internal=1 [L, QSA] 

你的第三条规则应该是相反的:

 # Change urlpath.php to urlpath RewriteCond %{HTTP_HOST} ^www\.mysite\.com$ [NC] RewriteCond %{REQUEST_FILENAME} !\.php$ [NC] RewriteRule ^/?(.*)$ $1.php [L,R=301] 

一旦用户去/联系,它会加载contact.php。 额外的RewriteCond是这样的,如果人们去contact.php,它不会尝试加载contact.php.php

据我所知,即使网址是/contact.php,也希望URL能够被联系。

您可以检查.php扩展名并进行重定向以将其删除。 使用R = 301(和你一样)。

然后你必须让你的服务器接受没有.php扩展名的URL。 它实际上可能已经这样做了。

这就是mod_negotiation所做的。 它应该默认安装,但可能必须启用它。

你也可以使用mod_rewrite来做到这一点,但从选项中删除R. 它将在内部重定向,而不是用HTTP重定向回答。