1

我正在尝试让 mod_rewrite 将所有不是文件的请求重定向到,index.php以便我可以处理干净 URL 的路由。

<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/or /test/folder/?request=/test/folder

4

2 回答 2

1

嗯,坚持是有回报的。jerdiggity 的回答提供了洞察力,这导致了进一步的实验和研究。最终,我得出的结论是,Apache 中肯定有一些东西正在重写尾部斜杠。

正如 jerdiggity 所怀疑的那样,所有的重写逻辑都是准确的,但是在另一个与目录相关的 Apache 模块 mod_dir 中称为DirectorySlash 指令的东西正在添加尾部斜杠。

显然,您可以简单地禁用这个指令,我将它添加到我的逻辑顶部:

DirectorySlash Off
RewriteEngine On
...
于 2013-06-29T07:57:06.700 回答
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文件中还有什么,因为在大多数情况下,它看起来应该可以正常工作。应该。;)

于 2013-06-29T04:21:17.450 回答