因此,有人要求我清理我们当前在 apache 上运行的 Web 应用程序的 URL(如果感兴趣的话,版本为 2.4.9),但在摆弄了几个小时的 mod re_write 命令后,我觉得我陷入了困境。以下是我正在尝试做的事情。
如果 URL 类似这样(http://www.foo.bar/admin/index.php),显示为http://www.foo.bar/admin
如果 URL 类似这样(http://www.foo.bar/admin/testpage.php),显示为http://www.foo.bar/admin/测试页面
如果 URL 类似这样(http://www.foo.bar/admin/testpage.php?id=15&foo=www),显示为http://www.foo.bar/admin/testpage?id=15&foo=www
到目前为止,我已经将它解析到 index.php 解析的位置....大部分.....并且第二个示例解析....有时。基本上,我拥有的代码似乎非常不稳定,并且只解析文件树中的两个级别。所以我想知道这里是否有人可以帮助我解决这个问题?这是我在 vhost 文件中的内容(因为我不想将它作为 .htaccess 文件放在每个目录中)
AllowOverride None
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([^/]+)/$ $1.php
RewriteRule ^([^/]+)/([^/]+)/$ /$1/$2.php
RewriteRule ^([^/]+)/([^/]+)/([^/]+)/$ /$1/$2/$3.php
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !(\.[a-zA-Z0-9]{1,5}|/)$
RewriteRule (.*)$ /$1/ [R=301,L]
答案1
类似这样的事情应该有效:
RewriteRule ([^/]+)/(.*)/?index.php$ $1
RewriteRule \.php $1
编辑:第一条规则可以用这条更直接的规则代替:
RewriteRule (.*)/index\.php?$ $1
例如:
网址 =http://www.foo.bar/admin/index.php
匹配规则 =RewriteRule ([^/]+)/(.*)/?index.php$ $1
结果 :http://www.foo.bar/admin
网址 =http://www.foo.bar/admin/testpage.php
匹配规则 =RewriteRule \.php $1
结果 =http://www.foo.bar/admin/testpage
网址 =http://www.foo.bar/admin/testpage.php?id=15&foo=www
匹配规则 =RewriteRule \.php $1
结果 =http://www.foo.bar/admin/testpage?id=15&foo=www