我有一个应用程序,它需要一个包含以下内容的htaccess文件:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(tileserver'.php)
RewriteRule ^(.*)$ tileserver.php?/$1 [L,QSA]
但我得到了404个与以下模式匹配的错误:
http://107.170.120.88/tileserver/extra5/11/331/794.png
和:
http://107.170.120.88/tileserver/extra5/11/331/796.grid.json
似乎任何带有路径的URL:
tileserver/extra5/
需要改为:
tileserver/tileserver.php/extra5/
但我没有太多的运气写一个htaccess文件来解决这个问题。
如果我取出
RewriteCond $1 !^(tileserver'.php)
RewriteRule ^(.*)$ tileserver.php?/$1 [L,QSA]
基本脚本不起作用,但如果我添加以下内容:
RewriteRule ^tileserver/extra5/(.*)$ tileserver/tileserver.php/extra5/$1
它没有效果。我该如何编写此规则?
---更新---
以下是完整的htaccess:
DirectoryIndex tileserver.php
RewriteEngine on
RewriteBase /tileserver/
<FilesMatch "'.mbtiles$">
Order Allow,Deny
Deny from all
</FilesMatch>
RewriteRule ^(.+).jpeg$ $1.jpg [L]
RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}]
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}]
RewriteRule ^tileserver.php - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ tileserver.php?/$1 [L,QSA]
注意,它位于一个子目录中,父目录(根目录)中有以下htaccess文件:
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
它从所有URL中删除index.php(对于codeigniter)。也许这是矛盾的?
使用这样的数据结构:
example.com/tileserver/tileserver.php
以及匹配模式的url107.170.120.88/tileserver/extra5/11/331/794.png
这将导致107.170.120.88/tileserver/tileserver.php?/extra5/11/331/794.png
你的.htaccess应该是这样的:
#turn on the rewrite engine
RewriteEngine On
#use the as base for your rewrite conditions the following folder
RewriteBase /tileserver
#since we don't want to rewrite the requests pointing directly to this script, leave it
RewriteRule ^tileserver.php - [L]
#if its not a file or a folder rewrite everything to tileserver.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
#everything that comes after /tileserver is passed as argument to the php script
RewriteRule ^(.*)$ tileserver.php?/$1 [L,QSA]
我怀疑问题可能是[L]
标志。
相反,请尝试:
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond $1 !^(tileserver'.php)
RewriteRule ^(.*)$ tileserver.php?/$1 [QSA]
RewriteRule ^tileserver/extra5/(.*) tileserver/tileserver.php/extra5/$1 [L,QSA]