我正在使用Kohana框架(但我认为这与该问题无关),可以像这样访问页面
http://www.example.com/articles/
http://www.example.com/index.php/articles/
现在,根据经验,我通常会尝试对.htaccess进行调整,使其仅允许一种进入页面的方式,并以静默方式重定向其他常用方式。
本质上,在上面的第一个URL中,该地址实际上在内部重定向到第二个示例。
我要执行的是强制将第二种类型的所有URL转换为第一种类型的URL。我对.htaccess并不经常有信心,而我的第一次尝试是抛出一些意想不到的结果(例如有时无休止的循环)
这是我想出的
RewriteRule ^index\.php/(.*) $1 [NC,L,R=301]
谁能告诉我我在做什么错,如果您也遇到了这个问题,您如何解决呢?
编辑
我决定发布我的整个.htaccess文件,以便可以检查我的所有重定向。
# Turn on URL rewriting
RewriteEngine On
# Installation directory
RewriteBase /~toberua/
# file not found page
ErrorDocument 404 /404/
ErrorDocument 403 /403/
# get people out of my directories
Options -Indexes
# default page to load
DirectoryIndex index.php
# add trailing slash if missing
RewriteRule ^(([a-z0-9\-]+/)*[a-z0-9\-]+)$ $1/ [NC,R=301,L]
# redirect /favicon.ico requests
RewriteCond %{REQUEST_URI} !^/images/layout/favicon\.ico [NC]
RewriteCond %{REQUEST_URI} favicon\.(gif|ico|png|jpe?g) [NC]
RewriteRule (.*) images/layout/favicon.ico [R=301,L]
# send /home back to TLD
RewriteRule home/ $1 [NC,R=301,L]
# ensure there is no /index.php in the address bar
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /.*index\.php\ HTTP/
RewriteRule ^(.*)index\.php$ $1 [R=301,L] # this was my attempt to stop /dir/index.php and make it simply /dir/
RewriteRule ^index\.php/(.*) $1 [NS,NC,L,R=301]
# Protect application and system files from being viewed
RewriteRule ^(application|modules|system) - [F,L]
# Allow any files or directories that exist to be displayed directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Rewrite all other URLs to index.php/URL
RewriteRule .* index.php/$0 [PT,L]
最佳答案
试试这个:
RewriteRule ^index\.php/(.*) $1 [NS,NC,L,R=301]
您未处理的是所有请求都将被重写,并且在进行重写时会生成一个子请求-该子请求也将被重写。因此,您需要将/ articles重写为/index.php/articles,然后在该问题的子请求中,将/index.php/articles重写为/ articles并为301重定向不断生成新请求。添加NS标志将使该规则不适用于子请求,我认为这应该可以解决您的问题,除非您还在/ articles-> /index.php/articles rewrite上执行301(但这太疯狂了)。
关于apache - 从网站网址中删除index.php,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/905030/