mod_rewrite 不在 XAMPP 上执行特定重定向 - 与 DirectoryIndex 冲突?
Posted
技术标签:
【中文标题】mod_rewrite 不在 XAMPP 上执行特定重定向 - 与 DirectoryIndex 冲突?【英文标题】:mod_rewrite doesn't execute specific redirects on XAMPP - conflict with DirectoryIndex? 【发布时间】:2014-04-04 20:36:40 【问题描述】:我们正在尝试设置本地开发 XAMPP 机器(Apache2,在 Windows 8 上)。
所有 mod_rewrite 指令都可以正常工作,除了一种特定类型的指令: 我们尝试将对某些目录的请求重定向到特定文件。
RewriteEngine On
RewriteRule ^/?$ add_survey.php [QSA,L]
index.php
被提供。
我们也尝试了^.?$
、^$
、/*
,但这些都不起作用。
这虽然有效(但过于包容)
RewriteRule ^.*$ add_survey.php [QSA,L]
我检查了通常的嫌疑人(对我来说),即Options -Multiviews
和Options -Indexes
,我的同事现在正在玩mod_dir,尽管我真的不明白为什么它会是罪魁祸首。
澄清我们的用例:
对/survey/
的请求应发送至add_survey.php
,而所有其他请求应发送至例如/survey/SURVEYNAME/upload
,在此上下文中,index.php
文件用作/survey/SURVEYNAME/
。
基本上所有文件都在特定的可用调查下构建,唯一可以在没有特定可用调查的情况下调用的文件是允许您创建新调查的文件。
/survey/ #-> add new survey, e.g. NAME (/survey/add_survey.php)
/survey/NAME/ #-> manage existing survey NAME (/survey/index.php?survey_name=NAME)
/survey/NAME/results #-> view results in NAME (/survey/results.php?survey_name=NAME)
【问题讨论】:
接受了给定的答案,因为它绕过了问题,但我仍然想知道是什么导致了 XAMPP 和其他堆栈之间的差异。 【参考方案1】:tl;dr: 添加 DirectoryIndex disabled
为了您的方便,我提出了拉取请求;)https://github.com/rubenarslan/formr.org/pull/82
有点晚了,但我今天不是在 XAMPP 上而是在 Ubuntu 14.04.1 上的 Apache 2.4.7 上遇到这个问题 ...
查看 Apache/rewrite 的调试输出后,看起来 Apache 正在尝试索引文件,而不是使用正确的重写。所以我的解决方案(或更可能的解决方法:)是为调查禁用 DirectoryIndex 并运行目录:
/webroot/admin/run/.htaccess
:
<IfModule mod_rewrite.c>
DirectoryIndex disabled
RewriteEngine On
RewriteRule ^/?$ add_run.php [QSA,L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^/?([A-Za-z0-9_]+)/?$ index.php?run_name=$1 [QSA,L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME.php !-d
RewriteCond %REQUEST_FILENAME.php !-f
RewriteRule ^([A-Za-z0-9_]+)/([A-Za-z0-9_]+)/?$ $2.php?run_name=$1 [QSA,L]
# on HU subdomain
# RewriteBase /survey/admin/run/
</IfModule>
/webroot/admin/survey/.htaccess
:
<IfModule mod_rewrite.c>
DirectoryIndex disabled
RewriteEngine On
RewriteRule ^/?$ add_survey.php [QSA,L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^/?([A-Za-z0-9_]+)/?$ index.php?study_name=$1 [QSA,L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME.php !-d
RewriteCond %REQUEST_FILENAME.php !-f
RewriteRule ^([A-Za-z0-9_]+)/([A-Za-z0-9_]+)/?$ $2.php?study_name=$1 [QSA,L]
# on HU subdomain
# RewriteBase /survey/admin/survey/
</IfModule>
对于那些喜欢这种古怪的东西并可能有助于加深理解的人 - 调试日志:
strip per-dir prefix: /var/www/formr/webroot/admin/survey/ ->
applying pattern '^/?$' to uri ''
rewrite '' -> 'add_survey.php'
add per-dir prefix: add_survey.php -> /var/www/formr/webroot/admin/survey/add_survey.php
看起来不错……但请稍等……
strip document_root prefix: /var/www/formr/webroot/admin/survey/add_survey.php -> /admin/survey/add_survey.php
internal redirect with /admin/survey/add_survey.php [INTERNAL REDIRECT]
现在让我们试试 index.html
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.html -> index.html
applying pattern '^/?$' to uri 'index.html'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.html -> index.html
applying pattern '^/?([A-Za-z0-9_]+)/?$' to uri 'index.html'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.html -> index.html
applying pattern '^([A-Za-z0-9_]+)/([A-Za-z0-9_]+)/?$' to uri 'index.html'
pass through /var/www/formr/webroot/admin/survey/index.html
和 .cgi ...有一段时间没看到这个了...
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.cgi -> index.cgi
applying pattern '^/?$' to uri 'index.cgi'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.cgi -> index.cgi
applying pattern '^/?([A-Za-z0-9_]+)/?$' to uri 'index.cgi'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.cgi -> index.cgi
applying pattern '^([A-Za-z0-9_]+)/([A-Za-z0-9_]+)/?$' to uri 'index.cgi'
pass through /var/www/formr/webroot/admin/survey/index.cgi
和 .pl ...
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.pl -> index.pl
applying pattern '^/?$' to uri 'index.pl'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.pl -> index.pl
applying pattern '^/?([A-Za-z0-9_]+)/?$' to uri 'index.pl'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.pl -> index.pl
applying pattern '^([A-Za-z0-9_]+)/([A-Za-z0-9_]+)/?$' to uri 'index.pl'
pass through /var/www/formr/webroot/admin/survey/index.pl
最后但并非最不重要的 .php ... oohh ... 看... index.php...
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.php -> index.php
applying pattern '^/?$' to uri 'index.php'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.php -> index.php
applying pattern '^/?([A-Za-z0-9_]+)/?$' to uri 'index.php'
strip per-dir prefix: /var/www/formr/webroot/admin/survey/index.php -> index.php
applying pattern '^([A-Za-z0-9_]+)/([A-Za-z0-9_]+)/?$' to uri 'index.php'
pass through /var/www/formr/webroot/admin/survey/index.php
【讨论】:
【参考方案2】:你可以在/survey/.htaccess
使用这个:
DirectoryIndex add_survey.php
编辑:
<IfModule mod_rewrite.c>
DirectoryIndex add_survey.php
RewriteEngine On
RewriteBase /survey/
RewriteRule ^/?$ add_survey.php [QSA,L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteCond %REQUEST_FILENAME.php !-d
RewriteCond %REQUEST_FILENAME.php !-f
RewriteRule ^(\w+)/(\w+)/?$ $2.php?study_name=$1 [QSA,L]
RewriteCond %REQUEST_FILENAME !-d
RewriteCond %REQUEST_FILENAME !-f
RewriteRule ^/?(\w+)/?$ index.php?study_name=$1 [QSA,L]
</IfModule>
【讨论】:
不,我不能。我将在问题中说明,我们也在使用index.php
文件,但在不同的上下文中,所以我不能只将请求重定向到 index.php
。
这不是重定向到index.php
但如果发布您当前的规则我可能会更好地理解。
/survey/
是不是一个真实的目录
不,它正在将请求重定向到index.php
,这就是问题所在。不过,我们也在使用index.php
,相应地改变了我的问题。无论哪种方式,我都想了解为什么 XAMPP 的行为会有所不同。是的,survey
是一个真实的目录,所以 index.php 就是它的 DirectoryIndex。
我已转发给我的同事,谢谢。你知道为什么 Xampp 和我们的其他 Apache2 安装之间会出现这种差异吗?以上是关于mod_rewrite 不在 XAMPP 上执行特定重定向 - 与 DirectoryIndex 冲突?的主要内容,如果未能解决你的问题,请参考以下文章
XAMPP .htaccess mod_rewrite 不工作
将 mod_rewrite 与 XAMPP 和 windows 7 - 64 位一起使用?
XAMPP httpd.conf 设置以允许 mod_rewrite 规则
从 xampp 移动到 apache 2.4.7 后,Laravel 路由返回 404。 mod_rewrite aur htaccess 或缺少 apache 设置?