0

我正在使用此代码从我的 URL 的末尾删除 .php,使它们更加 SEF。

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/(.+)\.php[^\s]* [NC]
RewriteRule ^ /%1 [R=301,NE,L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [QSA,NC,L]

这是通用的,并且适用于每个 UR 但我想知道如何为一个且只有一个 URL 创建例外,即: http://www.domain.com/serviceshttp://www.domain.com/services.php 不影响所有其他 URL 的情况下。这可能吗?

我尝试了一个简单的重定向但进入了一个循环。

!已编辑!

我没有提到我也有这些规则:

添加万维网。

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

删除索引(索引中的扩展名 .php 已被修剪)

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index/?([^\ \?]*) [NC]
RewriteRule ^ %1/%2 [R=301,L]
4

4 回答 4

2

你应该 :

  • 添加一个RewriteCond, 到禁用services.php => services
  • 添加另一条规则来强制执行services => services.php,因为第一条规则不会阻止用户手动使用servicesurl

满的.htaccess

# domain.tld > www.domain.tld (visible)
RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ http://www.%{HTTP_HOST}/$1 [R=301,L]

# services > services.php (visible)
RewriteRule ^services/?$ services.php [R=301,QSA,L]

# filename > filename.php (transparent)
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^ %{REQUEST_URI}.php [QSA,NC,L]

# filename.php > filename (visible, exception for services.php)
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/(.+)\.php[^\s]* [NC]
RewriteCond %{REQUEST_FILENAME} !services\.php
RewriteRule ^ /%1 [R=301,NE,L]

# index > /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s(.*)/index/?([^\ \?]*) [NC]
RewriteRule ^ %1/%2 [R=301,L]
于 2013-11-14T09:46:54.630 回答
1

我相信您的.php删除规则中的一个小改动就可以完成这项工作:

RewriteCond %{THE_REQUEST} ^[A-Z]{3,}\s/(.+?)\.php[\s?] [NC]
RewriteRule !^services\.php$ /%1 [R=301,NE,NC,L]
于 2013-11-15T07:06:49.437 回答
0

你可以试试这个,

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^\.]+)$ $1.php [NC,L]
于 2013-11-14T09:44:37.463 回答
0

您可以为每个 php 文件添加一个规则:

RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^services  /services.php [L]
于 2013-11-14T10:58:37.007 回答