.htaccess写法。有些服务器需要用?而不是/

本文详细解析了如何使用RewriteEngine、Options、Indexes、RewriteBase和RewriteRule等Apache配置指令,实现对特定文件类型请求的重定向,如ASP、ASPX、ASA等,同时介绍了针对新闻页面的URL重定向策略。

RewriteEngine on
# 是否显示根目录下文件列表
Options -Indexes
RewriteBase /
RewriteRule ^(.*)\.(asp|aspx|asa|asax|dll|jsp|cgi|fcgi|pl)(.*)$ /404.html
# Rewrite 系统规则请勿修改


RewriteRule ^news/$ index.php?news
RewriteRule ^news_detail/([0-9]+)$ index.php?news_detail?$1

 

其中:

RewriteRule ^news_detail/([0-9]+)$ index.php?news_detail?$1

<think>好的,用户的问题是关于如何配置.htaccess文件,使得URL重写规则生效并隐藏index.php。首先,我需要回忆一下Apache的mod_rewrite模块的基本用法。用户可能已经启用了mod_rewrite,但规则可能没写对,或者服务器配置没允许.htaccess覆盖。 根据引用[1]的内容,首先得确保Apache已经载了mod_rewrite模块,并且在httpd.conf中AllowOverride设置为All,这样.htaccess才能生效。用户提到要隐藏index.php,常见的情况是像CodeIgniter或Laravel这样的框架,需要将所有请求重写到index.php,同时去掉URL中的index.php部分。 接下来,检查用户可能的规则写法。引用[1]中的例子是RewriteRule ^/test([0-9]*).html$ /test.php?id=$1,但注意到在.htaccess文件中,路径通常不需要前面的斜杠,因为.htaccess是针对目录的。所以正确的规则应该是去掉开头的斜杠,比如RewriteRule ^test([0-9]*)\.html$ test.php?id=$1。 然后,用户需要隐藏index.php,可能需要将所有非真实文件或目录的请求重写到index.php。这时候应该使用RewriteCond来检查请求是否不是文件或目录,然后重写。引用[2]中提到了RewriteCond的用法,可以结合%{REQUEST_FILENAME}来判断。 还要注意规则中的标志,比如[L]表示最后一条规则,[QSA]用于追查询字符串,[NC]是否区分大小写。例如,正确的规则可能像这样: RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L,QSA] 同时,确保RewriteEngine On已经开启。另外,用户可能需要处理的是去除URL中的index.php,所以如果原来的URL包含index.php,规则应该将其重定向到没有的版本,比如: RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteRule (.*?)index\.php/*(.*) /$1$2 [R=301,L] 这样用户访问带有index.php的URL会被301重定向到干净的URL,然后再由后面的规则内部重写到index.php。 还要注意正则表达式中的转义字符,比如点号.需要转义为\.,否则会匹配任意字符。例如,正确的模式应该是^article/([0-9]+)\.html$而不是^article/([0-9]+).html$,否则.html中的点会匹配任何字符。 另外,检查是否启用了FollowSymLinks选项,有时候服务器配置中如果Options没有正确设置,可能会导致问题。引用[1]中提到有时候需要配置Options all,但更安全的做法是指定具体的选项,比如Options +FollowSymLinks。 最后,用户可能需要清除浏览器缓存或重启Apache服务来测试更改是否生效。同时,建议用户检查Apache的错误日志,以排除可能的语法错误或权限问题。</think>### 解决方案:配置`.htaccess`隐藏`index.php`并启用`mod_rewrite` 以下是分步配置说明,确保URL重写规则生效: --- #### **1. 验证Apache配置** - **载`mod_rewrite`模块** 在`httpd.conf`中确认已启用以下配置: ```apache LoadModule rewrite_module modules/mod_rewrite.so ``` - **允许`.htaccess`覆盖规则** 在对应目录配置中将`AllowOverride`设为`All`: ```apache <Directory "/var/www/html"> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> ``` --- #### **2. 编写`.htaccess`规则** 在网站根目录创建/修改`.htaccess`文件,添以下内容: ```apache RewriteEngine On RewriteBase / # 隐藏index.php(外部重定向) RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC] RewriteRule ^(.*?)index\.php(?:/(.*))?$ /$1$2 [R=301,L,NE] # 内部重写到index.php RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php?/$1 [L,QSA] ``` --- #### **3. 规则解析** - **`RewriteEngine On`** 启用重写引擎[^1]。 - **`RewriteBase /`** 设置基础路径为根目录,避免路径拼接错误。 - **隐藏`index.php`(外部重定向)** - `RewriteCond %{THE_REQUEST} ^GET.*index\.php [NC]`:匹配包含`index.php`的原始请求[^2]。 - `RewriteRule ^(.*?)index\.php(?:/(.*))?$ /$1$2 [R=301,L,NE]`:将含`index.php`的URL永久重定向到无`index.php`的版本(如`/index.php/article/1` → `/article/1`)。 - **内部重写到`index.php`** - `RewriteCond %{REQUEST_FILENAME} !-f`:排除真实文件的请求。 - `RewriteCond %{REQUEST_FILENAME} !-d`:排除真实目录的请求。 - `RewriteRule ^(.*)$ index.php?/$1 [L,QSA]`:将剩余请求路由到`index.php`,并保留原始查询参数(如`/article/1?id=2` → `index.php?/article/1&id=2`)。 --- #### **4. 测试与调试** - 检查语法错误: ```bash apachectl -t ``` - 查看错误日志: ```bash tail -f /var/log/apache2/error.log ``` - 清除浏览器缓存后测试URL。 --- #### **常见问题** 1. **规则未生效** - 确认`AllowOverride All`已配置。 - 确保`.htaccess`文件位于正确目录且权限为`644`。 2. **循环重定向** - 检查是否遗漏`L`标志或未正确排除真实文件/目录。 3. **参数丢失** - 添`QSA`标志以保留原始查询参数[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值