这是我的整个 mod_rewrite 条件:
<IfModule mod_rewrite.c>
<Directory /var/www/>
Options FollowSymLinks -Multiviews
AllowOverride None
Order allow,deny
allow from all
RewriteEngine On
# force www. (also does the IP thing)
RewriteCond %{HTTPS} !=on
RewriteCond %{HTTP_HOST} !^mysite\.com [NC]
RewriteRule ^(.*)$ http://mysite.com/$1 [R=301,L]
RewriteCond %{REQUEST_URI} ^system.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_URI} ^application.*
RewriteRule ^(.*)$ /index.php?/$1 [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)\.(\d+)\.(js|css|png|jpg|gif)$ $1.$3 [L]
RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)(.*)$ /$1$3 [r=301,L]
RewriteCond %{REQUEST_URI} !^(/index\.php|/assets|/robots\.txt|/sitemap\.xml|/favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]
# Block access to "hidden" directories or files whose names begin with a period. This
# includes directories used by version control systems such as Subversion or Git.
RewriteCond %{SCRIPT_FILENAME} -d [OR]
RewriteCond %{SCRIPT_FILENAME} -f
RewriteRule "(^|/)\." - [F]
</Directory>
</IfModule>
假设只允许访问mysite.com(/index.php|/assets|/robots.txt|/sitemap.xml|/favicon.ico)
注意到错误:mysite.com/sitemap vs mysite.com/sitemap.xml 这两个地址都解析为 xml 文件,而第一个 url 应该解析为 mysite.com/index.php/sitemap ***
出于某种原因,mod_rewrite 完全忽略了缺少扩展。对我来说,这听起来像是一个多视图问题,所以我禁用了多视图,但它仍在继续。
***然后一条不同的规则最终将取出 index.php,我遇到了另一个问题,当发生这种情况时,会留下一个额外的“/”。
这个 httpd 文件是为我的 codeigniter php 框架设置的
答: 嗯,我发现了问题,事实证明,即使我在 httpd.conf 文件中禁用了多视图,它们仍然在 /etc/apache2/sites-available/default 和 /etc/apache2/sites 中启用-可用/默认-ssl
这对:
区别对待这两个 URI。
/sitemap.xml
与 RewriteCond 不匹配并被传递到文件系统。/sitemap
与 RewriteCond 匹配并被重写为/index.php/sitemap
.问题是:您的应用程序使用该 URI 做什么?如果它找到
sitemap.xml
文件并为它提供服务,那将解释您所看到的行为。我真的看不出这些重写可以
/sitemap.xml
在请求时提供任何服务/sitemap
。验证请求是否通过您的应用程序运行的一种方法是创建一个新的日志文件并设置您的应用程序为每个请求附加一行,包括日期、请求 URI 和它计划提供的服务(或它从哪个模块运行代码)。您可能需要详细说明“额外斜杠”问题,并可能提供一些示例。我不太明白这个问题。
有了评论,我现在明白斜杠问题在这里了:
要去掉多余的斜线,您只需要将它与要剥离的其他部分一起包括在内:(
index.php
):