mod_rewrite现有目录更改地址栏中的URL

时间:2013-06-29 03:38:56

标签: .htaccess mod-rewrite

我正在尝试让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

2 个答案:

答案 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
...