HTAccess 重写问题
HTAccess Rewrite Issues
我正在编写一个通过 Oracle 数据库动态填充的网站。
我已完成桌面网站,现在需要创建移动网站。由于网站计划的外观有多么不同,我选择为移动网站和桌面网站创建 2 个不同的 "template" 网站。
但是,对于我的桌面站点,所有内容都是根据 index.php 文件构建的,以使其完全动态。因此,页面看起来像 url 中的 www.domain.com/index.php/page
。
对于桌面站点,这可行。我正在使用通用的 index.php 删除重写规则,以便使 url www.domain.com/page
但是仍然显示与之前的 URL.
相同的页面
我的问题是,现在我有 www.domain.com/mobile/index.php
。已经创建并且大部分情况下一直有效,但是在尝试向移动站点添加其他动态页面时。例如 www.domain.com/mobile/index.php/about
只是重定向到 www.domain.com/mobile/
,它甚至不包括 URL.
的 about
部分
经过多次调试,我发现肯定是 .htaccess
导致了问题。
如果您对我的问题有任何见解,请帮助我。
提前致谢
编辑 1
改写规则如下
# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) / [R=301,NE,L]
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/ [L]
根据您提到的调试,您的.htaccess 中有一条规则正在将www.domain.com/mobile/index.php/about
重写为www.domain.com/mobile/
。因此,如果您发现这是哪条规则,您可以在 上方添加一个 ,它将捕获您的移动页面请求的 URL,然后不允许有问题的规则遵循 运行。像这样:
RewriteRule ^mobile/index.php/([a-zA-Z0-9-_]+)$ ^mobile/index.php/ [L,QSA]
L
确保如果用户的请求匹配此规则,则不会执行其他规则(包括导致问题的规则)。
您可以在 /mobile/.htaccess
文件中使用此代码:
DirectoryIndex index.php
RewriteEngine On
RewriteBase /mobile/
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^index\.php(?:/(.*))?$ [L,R=302,NC,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/ [L]
这将覆盖 /mobile/
URI 路径的父 .htaccess 中存在的所有规则。
使它在 root .htaccess 中工作的简化版本:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(mobile)/(.*)$ /index.php/ [L,NC]
# Directs all EE web requests through the site index file
RewriteRule ^(.*)$ /index.php/ [L]
谢谢你们的回答,但是都没有用,我现在已经解决了问题,跟最后的RewriteRule有关
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/ [L]
我需要将其更改为
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !/mobile/.* [NC]
RewriteRule ^(.*)$ /index.php/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /mobile/.* [NC]
RewriteRule ^(.*)$ mobile/index.php/ [L]
这样它就可以同时用于移动和桌面网站。
我正在编写一个通过 Oracle 数据库动态填充的网站。
我已完成桌面网站,现在需要创建移动网站。由于网站计划的外观有多么不同,我选择为移动网站和桌面网站创建 2 个不同的 "template" 网站。
但是,对于我的桌面站点,所有内容都是根据 index.php 文件构建的,以使其完全动态。因此,页面看起来像 url 中的 www.domain.com/index.php/page
。
对于桌面站点,这可行。我正在使用通用的 index.php 删除重写规则,以便使 url www.domain.com/page
但是仍然显示与之前的 URL.
我的问题是,现在我有 www.domain.com/mobile/index.php
。已经创建并且大部分情况下一直有效,但是在尝试向移动站点添加其他动态页面时。例如 www.domain.com/mobile/index.php/about
只是重定向到 www.domain.com/mobile/
,它甚至不包括 URL.
about
部分
经过多次调试,我发现肯定是 .htaccess
导致了问题。
如果您对我的问题有任何见解,请帮助我。
提前致谢
编辑 1
改写规则如下
# Removes index.php from ExpressionEngine URLs
RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]
RewriteCond %{REQUEST_URI} !/system/.* [NC]
RewriteRule (.*?)index\.php/*(.*) / [R=301,NE,L]
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/ [L]
根据您提到的调试,您的.htaccess 中有一条规则正在将www.domain.com/mobile/index.php/about
重写为www.domain.com/mobile/
。因此,如果您发现这是哪条规则,您可以在 上方添加一个 ,它将捕获您的移动页面请求的 URL,然后不允许有问题的规则遵循 运行。像这样:
RewriteRule ^mobile/index.php/([a-zA-Z0-9-_]+)$ ^mobile/index.php/ [L,QSA]
L
确保如果用户的请求匹配此规则,则不会执行其他规则(包括导致问题的规则)。
您可以在 /mobile/.htaccess
文件中使用此代码:
DirectoryIndex index.php
RewriteEngine On
RewriteBase /mobile/
RewriteCond %{THE_REQUEST} /index\.php [NC]
RewriteRule ^index\.php(?:/(.*))?$ [L,R=302,NC,NE]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ index.php/ [L]
这将覆盖 /mobile/
URI 路径的父 .htaccess 中存在的所有规则。
使它在 root .htaccess 中工作的简化版本:
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^(mobile)/(.*)$ /index.php/ [L,NC]
# Directs all EE web requests through the site index file
RewriteRule ^(.*)$ /index.php/ [L]
谢谢你们的回答,但是都没有用,我现在已经解决了问题,跟最后的RewriteRule有关
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /index.php/ [L]
我需要将其更改为
# Directs all EE web requests through the site index file
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} !/mobile/.* [NC]
RewriteRule ^(.*)$ /index.php/ [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_URI} /mobile/.* [NC]
RewriteRule ^(.*)$ mobile/index.php/ [L]
这样它就可以同时用于移动和桌面网站。