我正在尝试允许启用MultiViews的Clean-Urls。
我拥有的所有页面都在根文件夹中。
我正在努力实现以下目标:
(current-status -> what I am trying to achieve)
1. foo.com/services.php -> foo.com/services
2. foo.com/services == foo.com/services/
3. foo.com/services.php/second-level/ == foo.com/services/second-level
services
不一个文件夹,我爆炸$_SERVER['PATH_INFO']
并获取第二级路径数据。
我已经实现了第一个,但是当我启用MultiViews
,使用.htaccess
文件并写入重写时,它失败了。
Options +Indexes +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule (.*) $1.php [L]
(这显然会失败,因为它会将请求更改为services / second-level.php)。
我知道我可以在.htaccess
中写入多个重写,并有条件地重定向。
但奇怪的事实是,在实时环境(共享主机)上,它正在工作,没有根文件夹中的任何.htaccess
文件。由于它是共享主机,我无法读取配置文件。
有关我应该更改哪些配置(apache.conf
或*.conf
)以实现上述目标的任何想法?
如果重要,我正在使用Apache/2.2.22
,这个问题在更新后就开始发生了。
答案 0 :(得分:11)
我终于弄明白了如何解决它。
这样做有效,完全删除.htaccess
文件,并更改Virtual Directory
以保留以下设置:
<VirtualHost *:80>
ServerAdmin my-email-id
ServerName foo.bar
DocumentRoot /var/www/sites/foo/
<Directory /var/www/sites/foo/>
Options +FollowSymLinks +MultiViews +Indexes
DirectoryIndex index.php
AddType application/x-httpd-php .php
</Directory>
</VirtualHost>
这有助于让所有页面正常工作,就像它们在服务器上工作一样,没有任何重写条件。
答案 1 :(得分:0)
清除没有.php扩展名且不使用MultiViews的网址。
使用mod_userdir和mod_rewrite支持虚拟子域的灵活Web环境。
允许以下网址布局
http://foo.bar/services.php/second-level/
http://foo.bar/services/second-level/
http://www.foo.bar/services/second-level/
http://127.0.0.1/services/second-level/
http://foo.bar/admin/login.php/foo
http://foo.bar/admin/login/foo
http://www.foo.bar/admin/login/foo
注意是否有前置www。是的,因为www。今天已经过时了......
但现在您可以通过在/var/www/sites/
中添加文件夹来简单地托管虚拟子域(请记住DNS)
http://images.foo.bar/imgpass.php/photo.jpg
http://images.foo.bar/imgpass/photo.jpg
http://www.images.foo.bar/imgpass/photo.jpg
http://127.0.0.1/~images/imgpass/photo.jpg
...依此类推,但如果/ var / www / sites / images / imgpass本身存在则会跳过。
我正在使用多用户环境,每个用户都有自己的webroot和子域。
/etc/apache2/sites-enabled/foo.bar.conf:
<VirtualHost *:80>
ServerAdmin my-email-id
ServerName foo.bar
ServerAlias 127.0.0.1 *.foo.bar
# The default web-root if no subdomain is given
DocumentRoot /var/www/sites/www/
UserDir /var/www/sites/*
<Directory /var/www/sites/*>
Order allow,deny
Allow from all
DirectoryIndex index.php index.html
Options -MultiViews -Indexes
# MultiViews workaround with 1 level subdir support
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} ^(\/var\/www\/sites\/.+(\/[^\/]+){2}).*
RewriteCond %1.php -f
RewriteRule ^\/var\/www\/sites\/(.+)((?:\/[^\/]+){2})(.*) /~$1$2.php$3 [L]
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} ^(\/var\/www\/sites\/.+(\/[^\/]+){1}).*
RewriteCond %1.php -f
RewriteRule ^\/var\/www\/sites\/(.+)((?:\/[^\/]+){1})(.*) /~$1$2.php$3 [L]
</Directory>
# Force all requests in background to UserDir compatible requests
RewriteEngine on
RewriteMap lc int:tolower
RewriteCond %{REQUEST_FILENAME} !^/~
RewriteCond %{HTTP_HOST} ^(www\.)?(.+)\.foo\.bar$
RewriteRule /(.*) /~${lc:%2}/$1 [PT,L]
</VirtualHost>
此代码不是testet,因为我的文件系统结构与初始示例完全不同。 所以我动态地转换了我的配置以适应这个示例结构。
请注意,配置不完整。您需要根据自己的需要自行调整。
答案 2 :(得分:0)
虽然可以使用MultiViews,但不将任意MIME类型添加到PHP文件中以使它们由MultiViews提供,例如accepted answer和许多其他来源互联网建议:
# Bad code - don't do this!
Options +MultiViews
AddType application/x-httpd-php .php
我在https://stackoverflow.com/a/24598848/1709587详细解释的这个黑客似乎有效,但实际上已被破坏;只要服务器收到Accept
标头不包含*/*
的请求,它就会失败。
相反,干净的解决方案是使用MultiviewsMatch
指令告诉Apache,无论请求的.php
和Accept
标头是什么,它都可以提供Accept-Language
个文件:
# Good code - use this instead!
Options +MultiViews
<Files "*.php">
MultiviewsMatch Any
</Files>