这是我的整个 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 完全忽略了缺少扩展的问题。这听起来像是 Multiviews 的问题,所以我禁用了 Multiviews,但问题仍然存在。
***然后,不同的规则最终会将index.php取出,当发生这种情况时,我遇到了另一个问题,即留下了一个额外的“/”。
这个 httpd 文件正在为我的 codeigniter php 框架设置
回答: 好吧,我发现了问题,事实证明,即使我在 httpd.conf 文件中禁用了 Multiviews,它们仍然在 /etc/apache2/sites-available/default 和 /etc/apache2/sites-available/default-ssl 中启用
答案1
这对:
RewriteCond %{REQUEST_URI} !^(/index\.php|/assets|/robots\.txt|/sitemap\.xml|/favicon\.ico)
RewriteRule ^(.*)$ /index.php/$1 [L]
区别对待这两个 URI。 /sitemap.xml
与 RewriteCond 不匹配并传递到文件系统。 /sitemap
与 RewriteCond 匹配并重写为/index.php/sitemap
。
问题是:您的应用如何处理该 URI?如果它找到该sitemap.xml
文件并提供该文件,那么这将解释您所看到的行为。
/sitemap.xml
当请求为 时,我真的看不出这些重写能起到什么作用/sitemap
。验证请求是否正在通过您的应用程序运行的一种方法是创建一个新的日志文件,并将您的应用程序设置为为每个请求附加一行,其中包括日期、请求 URI 以及它计划提供的内容(或它正在运行的代码来自哪个模块)。
您可能需要更详细地阐述“额外斜线”问题,也许可以提供一些例子。我不太明白这个问题。
通过评论,我现在明白斜线问题就在这里:
RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)(.*)$ /$1$3 [r=301,L]
要去掉多余的斜线,您只需将其与要删除的其他部分一起包含在内:( index.php
):
RewriteCond %{THE_REQUEST} /index\.(php|html)
RewriteRule (.*)index\.(php|html)/(.*)$ /$1$3 [r=301,L]