如何使用mod_rewrite从.htaccess引用当前目录?

All*_*lan 12 mod-rewrite

我想使用mod_rewrite制作漂亮的URL,但是只有一个版本的.htaccess文件可以用于服务器上的任何用户.

到目前为止,我有标准的漂亮网址.htaccess:

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$     /index.php/$1 [L]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想要类似的东西

RewriteRule ^(.*)$     %{URL of this file's directory}/index.php/$1 [L]
Run Code Online (Sandbox Code Playgroud)

这份文件会让我相信我想要的不是必要的:

注意:每个目录上下文中的模式匹配永远不要忘记模式应用于每个服务器配置文件中的完整URL.但是,在每个目录的配置文件中,每个目录前缀(对于特定目录始终相同)会自动删除以进行模式匹配,并在替换完成后自动添加.此功能对于许多种重写都是必不可少的 - 如果不这样,您将始终必须匹配父目录,这并非总是可行.

但是,我仍然得到错误的结果,无论我是否在rewriteRule上放置了index.php的前导/前面.

这个,

HTTP://服务器/测试/流/流

变成

HTTP://server/index.php/stream

不

HTTP://server/test/index.php/stream

当.htaccess文件在/ test /中时.

Li1*_*i1t 10

我遇到了类似的问题,但发现只是从根目录'/'导致我的测试网络服务器(Windows上的xampp)提供类似于以下URL的URL:

HTTP://本地主机/ C:/ XAMPP/htdocs中/网站/测试/

不完美.我的解决方案是使用RewriteCond从REQUEST_URI中提取路径.以下是从URL末尾删除不需要的"index.php"的示例:

RewriteCond %{REQUEST_URI} ^(.*)/index.php$
RewriteRule index.php %1/ [r=301,L]
Run Code Online (Sandbox Code Playgroud)

注意:百分号符号为"%1 /",而不是美元符号.

%1-%9获取最后匹配的RewriteCond的模式,$ 1- $ 9获取RewriteRule的模式.

请参阅:http: //httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond

干杯:)


All*_*lan 4

事实证明,是否在 index.php 前面放置一个前导 / 确实很重要。通过将其关闭,脚本可以正常工作。我一直在使用 R 标志进行测试,该标志在重定向上使用物理目录。

  • 是的,**但是** [通过将其保留,您将依赖于 rewritebase 的值](/sf/answers/801023611/),它**可能不是**您的 htaccess 父文件夹。无论如何,放弃它是一种黑客解决方案,而不是真正的解决方案。 (2认同)