简体   繁体   English

.htaccess代码在本地工作正常,但没有在cpanel在线工作

[英].htaccess code working fine on local but not working on cpanel online

I am using below code to make pretty URL 我使用下面的代码来制作漂亮的URL

#code to make pretty URLS | we're using this code to achieve /category/slug
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]

This code seems to be working very perfect on localhost, but as soon as I deployed it online, it didn't work, it didn't show any internal error it shows 404 not found. 这段代码似乎在localhost上工作得非常完美,但是一旦我在网上部署它,它就不起作用,它没有显示任何内部错误,它显示404未找到。 As if it is looking for a folder or file. 好像在寻找文件夹或文件。

Where is the error or am I missing any logic that should be kept in mind, on localhost and online. 错误在哪里,或者我错过了在localhost和online上应该记住的任何逻辑。

I am having a URL that has been redirected to a file 我有一个已重定向到文件的URL

www.xyz.com/technology (This URL only for getting category) www.xyz.com/technology/some-post (This URL only for getting category and slug) www.xyz.com/technology(此URL仅用于获取类别)www.xyz.com/technology/some-post(此URL仅用于获取类别和slug)

I have some URLs: 我有一些网址:

www.xyz.com/post.php?category=technology&slug=some-slug to www.xyz.com/technology/some-slug (Now this rule, if it has only one parameter I'll run query only for a category if it has 2 params then ill run for category and slug) www.xyz.com/post.php?category=technology&slug=some-slug to www.xyz.com/technology/some-slug(现在这个规则,如果它只有一个参数,我将只运行查询一个类别它有2个参数然后运行类别和slug)

This is my whole .htaccess code 这是我的整个.htaccess代码

<IfModule mod_rewrite.c>
RewriteEngine On

#for normal domains like example.com or example.in to redirect to https://www.example.com
#RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} ^([^\.]+)\.(com|in)$ [NC]
#RewriteRule ^ https://www.%1.%2%{REQUEST_URI} [R=301,L,NE]

#for subdomain like test.example.com to redirect to https://test.example.com
#RewriteCond %{HTTP_HOST} !^www\. [NC,OR]
#RewriteCond %{HTTPS} off
#RewriteCond %{HTTP_HOST} ^([\.\w\-]*)\.(com|in)$ [NC]
#RewriteRule ^ https://%1.%2%{REQUEST_URI} [R=301,L,NE]

# Block suspicious request methods
RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK|DEBUG) [NC]
RewriteRule ^(.*)$ - [F,L]

RewriteRule ^post/(\d+)*$ ./post.php?category=$1&slug=$2

# Block WP timthumb hack
RewriteCond %{REQUEST_URI} (timthumb\.php|phpthumb\.php|thumb\.php|thumbs\.php) [NC]
RewriteRule . - [S=1]

# Block suspicious user agents and requests
RewriteCond %{HTTP_USER_AGENT} (libwww-perl|wget|python|nikto|curl|scan|java|winhttp|clshttp|loader) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{HTTP_USER_AGENT} (;|<|>|'|"|\)|\(|%0A|%0D|%22|%27|%28|%3C|%3E|%00).*(libwww-perl|wget|python|nikto|curl|scan|java|winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR]
RewriteCond %{THE_REQUEST} \?\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} \/\*\ HTTP/ [NC,OR]
RewriteCond %{THE_REQUEST} etc/passwd [NC,OR]
RewriteCond %{THE_REQUEST} cgi-bin [NC,OR]
RewriteCond %{THE_REQUEST} (%0A|%0D) [NC,OR]

# Block MySQL injections, RFI, base64, etc.
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR]
RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC,OR]
RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC,OR]
RewriteCond %{QUERY_STRING} (\.\./|\.\.) [OR]
RewriteCond %{QUERY_STRING} ftp\: [NC,OR]
RewriteCond %{QUERY_STRING} http\: [NC,OR]
RewriteCond %{QUERY_STRING} https\: [NC,OR]
RewriteCond %{QUERY_STRING} \=\|w\| [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)/self/(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} ^(.*)cPath=http://(.*)$ [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*script.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (\<|%3C).*iframe.*(\>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} (<|%3C)([^i]*i)+frame.*(>|%3E) [NC,OR]
RewriteCond %{QUERY_STRING} base64_encode.*\(.*\) [NC,OR]
RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [NC,OR]
RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) [OR]
RewriteCond %{QUERY_STRING} ^.*(\[|\]|\(|\)|<|>).* [NC,OR]
RewriteCond %{QUERY_STRING} (NULL|OUTFILE|LOAD_FILE) [OR]
RewriteCond %{QUERY_STRING} (\./|\../|\.../)+(motd|etc|bin) [NC,OR]
RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR]
RewriteCond %{QUERY_STRING} (<|>|'|%0A|%0D|%27|%3C|%3E|%00) [NC,OR]
RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR]
RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC,OR]
RewriteCond %{QUERY_STRING} (;|<|>|'|"|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|drop|delete|update|cast|create|char|convert|alter|declare|order|script|set|md5|benchmark|encode) [NC,OR]
RewriteCond %{QUERY_STRING} (sp_executesql) [NC]
RewriteRule ^(.*)$ - [F,L]

# We are setting here the default file to load while the URL is called followed by fallback files
DirectoryIndex index.php

# Redirect all requests except only POST
RewriteCond %{REQUEST_METHOD} !POST
RewriteCond %{THE_REQUEST} \s/+(.*?/)?(?:index)?(.*?)\.(?:php?)[\s?/] [NC]
RewriteRule ^ /%1%2 [R=302,L,NE]

# Adds a trailing directory if rewritten URI is a direcory
RewriteCond %{DOCUMENT_ROOT}/app/$1 -d
RewriteRule ^(.*?[^/])$ %{REQUEST_URI}/ [L]

# Over here we have set the default root directory now request will be directly made from this directory
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteCond %{REQUEST_URI} !/app/ [NC]
RewriteRule (.*) /app/$1 [L]

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME}.php -f
RewriteRule ^(.+?)/?$ $1.php [L]

#code to make pretty URLS | we're using this code to achieve /category/slug
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]

# We are setting this rules to stop botnets and hackers or other users from copying website contents i.e antihack

RewriteCond %{HTTP_USER_AGENT} ^BlackWidow [OR]
RewriteCond %{HTTP_USER_AGENT} ^Bot\ mailto:craftbot@yahoo.com [OR]
RewriteCond %{HTTP_USER_AGENT} ^ChinaClaw [OR]
RewriteCond %{HTTP_USER_AGENT} ^Custo [OR]
RewriteCond %{HTTP_USER_AGENT} ^DISCo [OR]
RewriteCond %{HTTP_USER_AGENT} ^Download\ Demon [OR]
RewriteCond %{HTTP_USER_AGENT} ^eCatch [OR]
RewriteCond %{HTTP_USER_AGENT} ^EirGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailSiphon [OR]
RewriteCond %{HTTP_USER_AGENT} ^EmailWolf [OR]
RewriteCond %{HTTP_USER_AGENT} ^Express\ WebPictures [OR]
RewriteCond %{HTTP_USER_AGENT} ^ExtractorPro [OR]
RewriteCond %{HTTP_USER_AGENT} ^EyeNetIE [OR]
RewriteCond %{HTTP_USER_AGENT} ^FlashGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetRight [OR]
RewriteCond %{HTTP_USER_AGENT} ^GetWeb! [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go!Zilla [OR]
RewriteCond %{HTTP_USER_AGENT} ^Go-Ahead-Got-It [OR]
RewriteCond %{HTTP_USER_AGENT} ^GrabNet [OR]
RewriteCond %{HTTP_USER_AGENT} ^Grafula [OR]
RewriteCond %{HTTP_USER_AGENT} ^HMView [OR]
RewriteCond %{HTTP_USER_AGENT} HTTrack [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Stripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^Image\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} Indy\ Library [NC,OR]
RewriteCond %{HTTP_USER_AGENT} ^InterGET [OR]
RewriteCond %{HTTP_USER_AGENT} ^Internet\ Ninja [OR]
RewriteCond %{HTTP_USER_AGENT} ^JetCar [OR]
RewriteCond %{HTTP_USER_AGENT} ^JOC\ Web\ Spider [OR]
RewriteCond %{HTTP_USER_AGENT} ^larbin [OR]
RewriteCond %{HTTP_USER_AGENT} ^LeechFTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mass\ Downloader [OR]
RewriteCond %{HTTP_USER_AGENT} ^MIDown\ tool [OR]
RewriteCond %{HTTP_USER_AGENT} ^Mister\ PiX [OR]
RewriteCond %{HTTP_USER_AGENT} ^Navroad [OR]
RewriteCond %{HTTP_USER_AGENT} ^NearSite [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetAnts [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Net\ Vampire [OR]
RewriteCond %{HTTP_USER_AGENT} ^NetZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Octopus [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Explorer [OR]
RewriteCond %{HTTP_USER_AGENT} ^Offline\ Navigator [OR]
RewriteCond %{HTTP_USER_AGENT} ^PageGrabber [OR]
RewriteCond %{HTTP_USER_AGENT} ^Papa\ Foto [OR]
RewriteCond %{HTTP_USER_AGENT} ^pavuk [OR]
RewriteCond %{HTTP_USER_AGENT} ^pcBrowser [OR]
RewriteCond %{HTTP_USER_AGENT} ^RealDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^ReGet [OR]
RewriteCond %{HTTP_USER_AGENT} ^SiteSnagger [OR]
RewriteCond %{HTTP_USER_AGENT} ^SmartDownload [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperBot [OR]
RewriteCond %{HTTP_USER_AGENT} ^SuperHTTP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Surfbot [OR]
RewriteCond %{HTTP_USER_AGENT} ^tAkeOut [OR]
RewriteCond %{HTTP_USER_AGENT} ^Teleport\ Pro [OR]
RewriteCond %{HTTP_USER_AGENT} ^VoidEYE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Image\ Collector [OR]
RewriteCond %{HTTP_USER_AGENT} ^Web\ Sucker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebAuto [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebCopier [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebFetch [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebGo\ IS [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebLeacher [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebReaper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebSauger [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ eXtractor [OR]
RewriteCond %{HTTP_USER_AGENT} ^Website\ Quester [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebStripper [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebWhacker [OR]
RewriteCond %{HTTP_USER_AGENT} ^WebZIP [OR]
RewriteCond %{HTTP_USER_AGENT} ^Wget [OR]
RewriteCond %{HTTP_USER_AGENT} ^Widow [OR]
RewriteCond %{HTTP_USER_AGENT} ^WWWOFFLE [OR]
RewriteCond %{HTTP_USER_AGENT} ^Xaldon\ WebSpider [OR]
RewriteCond %{HTTP_USER_AGENT} ^Zeus
RewriteRule ^.* - [F,L]

# We are setting here default charset & language headers setting for our website
AddDefaultCharset UTF-8
DefaultLanguage en-US

Allow from all

# Disable directory browsing
Options All -Indexes

I was researching a bit for a while, I learnt a few things. 我正在研究一段时间,我学到了一些东西。

Things work pretty great on localhost but the rules work very strictly when it comes to online. 在localhost上工作得非常好,但是当涉及到在线时,规则非常严格。 (We're all aware of it) (我们都知道)

However the codes you posted were all correct but still, it was not working. 但是,您发布的代码都是正确的,但仍然无效。 I tried digging up why isn't it working, as I can't see any error in the log, also there are no 500(Internal Error) going on. 我试着挖掘为什么它不起作用,因为我在日志中看不到任何错误,也没有500(内部错误)正在进行。

Also, I tweaked the code and I found that the following thing just I had to change 此外,我调整了代码,我发现以下事情只是我必须改变

This was my existing code 这是我现有的代码

#code to make pretty URLS | we're using this code to achieve /category/slug
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]

For which in above comments I found useful answers which are working with localhost. 在上面的评论中,我找到了与localhost一起使用的有用答案。

Following was the answer proposed 以下是提出的答案

<IfModule mod_rewrite.c>
  RewriteEngine On

  #code to make pretty URLS | we're using this code to achieve /category/slug
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
  RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]
</IfModule>

This code works fine even I don't use <IfModule mod_rewrite.c> 这段代码工作正常,即使我不使用<IfModule mod_rewrite.c>

The problem was only in this section, the logic was a bit wrong (The code is fine but for localhost where you're working for development) 问题只出现在这一部分,逻辑有点不对(代码很好但是对于你正在为开发工作的localhost)

RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]

I used this code in my .htaccess file as you can see while i asked the question 我在我的.htaccess文件中使用了这段代码,正如我在问这个问题时所看到的那样

# Over here we have set the default root directory now request will be directly made from this directory
RewriteCond %{HTTP_HOST} ^(?:www\.)?(.+)$ [NC]
RewriteCond %{REQUEST_URI} !/app/ [NC]
RewriteRule (.*) /app/$1 [L]

The above code redirected requests from the base location to /app folder this was an internal redirect but externally no one would know what's the URL exactly. 上面的代码将基本位置的请求重定向到/app文件夹,这是一个内部重定向,但在外部没有人会确切地知道URL是什么。

My folder structure is 我的文件夹结构是

Base Folder - App - post.php .htaccess

If I use this code 如果我使用此代码

RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]

it will search for the file in Base Folder ie the file which resides near App Folder with it, whereas my file was inside app folder 它将搜索基本文件夹中的文件,即文件位于App Folder附近,而我的文件位于app文件夹中

So, I used the following code, just add app/ before post.php 所以,我使用了以下代码,只需在post.php之前添加app/

RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ app/post.php?folder=$1&category=$2&slug=$3 [L,QSA]
RewriteRule ^(.+)/([\w-]+)$ app/post.php?folder=$1&category=$2   [L]

and it worked on localhost as well as online on production(Online) 它适用于localhost以及在线制作(在线)

What I understood is localhost takes code casually. 我理解的是localhost随便占用代码。 But, in terms of online, it doesn't so now the request searches for a file inside the app directory and not beside the app directory. 但是,就在线而言,现在请求不会搜索app目录中的文件而不是app目录旁边的文件。

Sometimes the htaccess commands work inside modules. 有时htaccess命令在模块内部工作。

Try this one. 试试这个吧。

<IfModule mod_rewrite.c>
    RewriteEngine On

    #code to make pretty URLS | we're using this code to achieve /category/slug
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.+)/([\w-]+)/([\w-]+)$ post.php?folder=$1&category=$2&slug=$3 [L,QSA]
    RewriteRule ^(.+)/([\w-]+)$ post.php?folder=$1&category=$2   [L]
</IfModule>

Try either mod_rewrite.c or mod_rewrite.so 尝试mod_rewrite.cmod_rewrite.so

Also this is a brilliant website to test if your regex works. 这也是一个很棒的网站,可以测试你的正则表达式是否有效。

UPDATE: 更新:

Please try these rules: 请尝试以下规则:

RewriteRule ^([^/]*)/([^/]*)/([^/]*)$ post.php?folder=$1&category=$2&slug=$3 [L]
RewriteRule ^([^/]*)/([^/]*)$ post.php?category=$1&slug=$2 [L]

Also try to run it with and without <IfModule ...> 还尝试使用和不使用<IfModule ...>运行它

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM