我有一个apache2服务器。
我的目录结构是 - (下面是 - / some-folder / abc )
- app
- otherfolder
- pqr.php
- xyz.php
- js
- css
.htaccess放在/ some-folder / abc
中虚拟主机的上下文根设置为 - / some-folder /
现在,我希望我的用户输入此网址 - http://someserver.com/abc/xyz
或http://someserver.com/abc/pqr
我想在 - http://someserver.com/abc/app/xyz.php
或http://someserver.com/abc/app/pqr.php
如何使用URL重写mod_rewrite
实现此目的这是我到目前为止所做的,但是没有用 -
Options +FollowSymLinks -MultiViews
#Turn mod_rewrite on
RewriteEngine On
#RewriteBase /abc
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}\.php -f
RewriteRule ^(.*)$ /app/$1\.php [L] # this doesn't work either
# RewriteRule ^(.*)$ app/$1.php [L] # this doesn't work either
# RewriteRule ^abc/(.*)$ abc/app/$1.php [L] # this doesn't work either
感谢您的帮助。
如果可能的话,我还想使用正斜杠来获取所有查询参数
前 - http://someserver.com/abc/app/xyz.php/xId/123/uId/938/sdh/8374
代替http://someserver.com/abc/app/xyz.php?xId=123?uId=938?sdh=8374
查询参数没有模式,它们可以是页面的任何内容。这可能是通用的mod_rewrite,还是我必须为每个页面重写URL,每次我的开发人员添加一个新的查询参数?
答案 0 :(得分:1)
此规则适用于/abc/.htaccess
:
Options +FollowSymLinks -MultiViews
RewriteEngine On
RewriteCond %{DOCUMENT_ROOT}/abc/app/$1.php -f
RewriteRule ^(?!internal)(.+?)/?$ app/$1.php [L,NC]
RewriteCond
确保我们在.php
子目录中有相应的/abc/app/
文件。(?!internal)
是从这次重写中跳过internal
的否定先行断言。此外,您似乎正在使用css / js / images的相对网址,例如src="abc.png"
,您当前的网址为:/abc/xyz
,然后浏览器会将此相对网址解析为http://example.com/abc/xyz/abc.png
,这显然会导致404
,因为您的静态文件位于/abc/app/
子目录。
您可以在页面的<head>
部分的HTML下面添加:
<base href="/abc/app/" />
以便从该基本网址解析每个相对网址,而不是从当前网页的网址解析。
另外,作为使用绝对链接而不是相对链接的做法,请将相对链接<a href="xyz">XYZ</a>
更改为此<a href="/abc/xyz">XYZ</a>