HTACCESS规则重定向错误

时间:2016-03-15 18:03:42

标签: php .htaccess redirect

在我的htaccess文件中,我添加了一个将url / abc / xyz重定向到url / abc / xyz.php的规则,所以现在即使我尝试访问url / abc.php,它也会将我重定向到url / abc /

帮我解决这个问题..我的代码现在:

# To externally redirect /dir/foo.php to /dir/foo
RewriteCond %{THE_REQUEST} ^GET\s([^.]+)\.php\s [NC]
RewriteRule ^ %1 [R,L]

## To internally forward /dir/foo to /dir/foo.php
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteCond %{QUERY_STRING} ^$
RewriteRule ^(.*?)/?$ $1.php [L]

我想要的是:

  

url / abc.php& url / abc应该转到url / abc.php

     

url / abc.php /#x& url / abc / #x应该转到url / abc.php / #x

2 个答案:

答案 0 :(得分:3)

如果我已正确解释您的意图,则以下重写规则应符合您的意愿:

# Enable rewriting
RewriteEngine On

# Define site root
RewriteBase /

# Do not rewrite for image, css or js files
RewriteRule \.(css|jpe?g|gif|png|js)$ - [L]

# Add index.php to requests ending with a trailing slash
RewriteRule ^([a-z0-9_\-/]*/)?$ $1index.php [NC,R=301,L]

# Add .php to the end of a request without a trailing slash
RewriteRule ^(([a-z0-9_\-]+/)*[a-z0-9\-]+)$ $1.php [NC,R=301,L]

规则的作用:

  • 重写相对于域的根(/)
  • 重写规则将忽略规则nr 2中列出的文件扩展名的任何文件。
  • http://example.com/(或http://example.com),http://example.com/foo/http://example.com/foo/bar/的请求将被重写为http://example.com/index.phphttp://example.com/foo/index.php和{{1}分别
  • http://example.com/foo/bar/index.phphttp://example.com/baz的请求将分别改为http://example.com/baz/boohttp://example.com/baz.php

答案 1 :(得分:1)

URL片段(#)永远不会发送到服务器,因此您无法使用mod_rewrite重定向它。换句话说,#只在浏览器中解释,所以你不必在.htaccess中担心它。

此代码应该适合您,或至少让您入门:

<IfModule mod_rewrite.c>
    RewriteEngine on
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME}\.php -f
    RewriteRule ^(.*)$ $1.php
</IfModule>

我还将它包含在一个IfModule中,以检查是否首先启用了mod_rewrite。

然而,我首选的方法是将所有内容重定向到index.php,然后在那里使用PHP代码来分解URL并重定向到相应的页面。这对模型 - 视图 - 控制器(MVC)系统和其他类似变体非常有效。这也允许从一个地方而不是许多地方加载所有通用站点设置。以下是我将用于此类设置的代码:

<IfModule mod_rewrite.c>
  RewriteEngine on
  RewriteCond %{REQUEST_URI} !^/img/[0-9a-zA-Z_\-]+\.(gif|jpg|png)$
  RewriteCond %{REQUEST_URI} !^/css/[0-9a-zA-Z_\-]+\.css$
  RewriteCond %{REQUEST_URI} !^/js/[0-9a-zA-Z_\-]+\.js$
  RewriteRule ^.+$ index.php [L]
</IfModule>

前三行表示不重定向指定目录中的任何图像,css或js文件。