在我的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
答案 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]
规则的作用:
http://example.com/
(或http://example.com
),http://example.com/foo/
和http://example.com/foo/bar/
的请求将被重写为http://example.com/index.php
,http://example.com/foo/index.php
和{{1}分别http://example.com/foo/bar/index.php
和http://example.com/baz
的请求将分别改为http://example.com/baz/boo
和http://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文件。