我正在尝试让mod_rewrite将所有非文件请求重定向到index.php
,以便我可以处理干净网址的路由。
<IfModule mod_rewrite.c>
RewriteEngine On
# Route requests to index.php for processing
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.+)$ index.php?request=$1 [QSA,L]
</IfModule>
出于某种原因,当我访问没有尾部斜杠的现有目录时,地址栏会重新形成以包含一个尾部斜杠和查询字符串,这不是很干净。
我可以通过将RewriteRule更改为^(.+)/$
并添加RewriteBase /
来改善这一点。但是,这会将所有URL定向到带有斜杠的URL。没什么大不了的,但不是我想要的。
例如,如果/test/folder
存在并且我直接转到该地址,我希望地址栏显示该内容,而不是显示/test/folder/
或/test/folder/?request=/test/folder
。
答案 0 :(得分:1)
我试试看:
DirectoryIndex index.php
<IfModule mod_rewrite.c>
RewriteEngine On
# I tested this inside a subdir named "stack", so I had to uncomment the next line
#RewriteBase /stack
# Route requests to index.php for processing
# Check if the request is NOT for a file:
RewriteCond %{REQUEST_FILENAME} !-f
# Check if the request IS for an existing directory:
RewriteCond %{REQUEST_FILENAME} -d
# If all criteria are met, send everything to index.php as a GET request whose
# key is "request" and whose value is the entire requested URI, including any
# original GET query strings by adding QSA (remove QSA if you don't want the
# Query String Appended):
RewriteRule .* index.php?request=%{REQUEST_URI} [R,L,QSA]
</IfModule>
如果这不起作用,请告诉我你的.htaccess
文件中还有什么内容,因为在大多数情况下,它看起来应该有效。 应该。 ;)
答案 1 :(得分:1)
好吧,坚持不懈。 jerdiggity的答案提供了洞察力,这导致了进一步的实验和研究。最后,我得出的结论是,必须在Apache中构建一些重写斜杠的东西。
正如jerdiggity所怀疑的那样,所有的Rewrite逻辑都是准确的,但在另一个与目录相关的Apache模块mod_dir中称为DirectorySlash Directive的东西正在添加尾部斜杠。
显然,您可以简单地禁用此指令,我将其添加到逻辑顶部:
DirectorySlash Off
RewriteEngine On
...